|
ООП С Sharp - Экземпляры объектов
Проще всего понять, как использовать класс в коде, можно, представив его как новый тип переменных. Вы используете предопределенные типы переменных — такие как int, float, double и прочие. Объявляя класс Authenticator, вы тем самым сообщаете компилятору о существовании нового типа переменной, называемого Authenticator. Определение класса содержит все, что компилятору нужно знать, чтобы быть готовым к работе с переменными этого типа.
Таким образом, точно так же, как компилятор знает, что double содержит число с плавающей запятой, сохраненное в определенном формате (что, например, позволяет складывать значения типа double), объявление класса сообщает компилятору, что переменная типа Authenticator содержит string и позволяет вам вызывать методы IsPasswordCorrect() и ChangePassword().
Создание определяемой пользователем переменной, называется созданием экземпляра объекта. Экземпляр — это просто конкретное воплощение объекта. Поэтому, если ваш объект Authenticator — просто новый вид переменной, вы должны быть готовы использовать его точно так же, как любую другую переменную — и вы это можете, как доказывает следующий пример.
using System;
namespace Wrox.ProCSharp.OOProg
{
class MainEntryPoint
{
static void Main()
{
Authenticator myAccess = new Authenticator();
bool done;
done = myAccess.ChangePassword("", "MyNewPassword");
if (done == true)
Console.WriteLine("Пароль для myAccess изменен");
else
Console.WriteLine("Не удалось изменить пароль myAccess");
done = myAccess.ChangePassword("", "AnotherPassword");
if (done == true)
Console.WriteLine("Пароль для myAccess изменен");
else
Console.WriteLine("Не удалось изменить пароль myAccess");
if (myAccess.IsPasswordCorrect("WhatPassword"))
Console.WriteLine("Пароль myAccess проверен");
else
Console.WriteLine("Пароль myAccess не прошел проверку");
}
}
public class Authenticator
{
// Реализация показана выше
}
}
Реализация класса MainEntryPoint подобна Authenticator — он может иметь свои собственные члены (то есть собственные поля, методы и так далее). Однако в данном случае он служит лишь контейнером для метода Main() — точки хода в программу. Такой подход означает, что класс Authenticator может оставаться просто классом, который используют другие программы (либо посредством вырезания и вставки его кода, либо путем его компиляции в отдельную сборку). MainEntryPoint оформлен в виде класса, потому что существует синтаксическое требование C#, гласящее, что главная точка входа в программу должна быть определена внутри класса, а не в виде независимой функции. Поскольку все действие происходит в методе Main(), рассмотрим его более внимательно. Вот первая строка, представляющая интерес:
Authenticator myAccess = new Authenticator();
Здесь объявляется и создается новый экземпляр объекта Authenticator. Не беспокойтесь пока о = new Authenticator() — это часть синтаксиса C#, и присутствует она здесь потому, что в C# классы всегда доступны по ссылке. Вы можете использовать следующую строку, если хотите просто объявить новый объект Authenticator с именем myAccess:
Это объявление может содержать ссылку на объект Authenticator без действительного создания какого-либо объекта (примерно так же, как в Visual Basic строка Dim obj As Object не создает никакого объекта). Операция new в C# — это то, что в действительности создает объект Authenticator.
Вызов методов класса выполняется с помощью символа точки (.), присоединенной к имени переменной:
done = myAccess.ChangePassword("", "MyNewPassword");
Здесь вызывается метод ChangePassword() экземпляра myAccess, а возвращенное значение помещается в переменную done типа Boolean. Аналогичным образом можно обращаться к полям класса. Однако, обратите внимание, что вы не можете поступить так:
string myAccessPassword = myAccess.password;
Этот код вызовет ошибку компиляции, поскольку поле password помечено как private, поэтому прочий код, находящийся вне Authenticator, не имеет доступа к нему. Если вы измените модификатор доступа поля password на public, предыдущая строка скомпилируется, и значение поля password будет присвоено строковой переменной.
Следует отметить, что если вы обращаетесь к методу или полю изнутри того же класса, то достаточно использовать только соответствующее имя непосредственно.
Теперь, когда вы понимаете, как создавать экземпляры объектов, вызывать методы класса, обращаться к открытым полям, логика метода Main() станет вполне понятной. После сохранения этого кода как Authenticator.cs, компиляции и запуска получается следующий результат:
Authenticator
Пароль для myAccess изменен
Не удалось изменить пароль myAccess
Пароль myAccess не прошел проверку
Необходимо отметить два момента относительно приведенного выше кода. Во-первых, пока мы не делали ничего нового по сравнению с кодированием модуля класса Visual Basic, равно как и ничего такого, что отличалось бы от базового синтаксиса C#. Цель этого примера — убедиться, что вы четко понимаете концепции, лежащие в основе классов.
Во-вторых, в предыдущем примере используется класс Authenticator непосредственно в другом коде внутри того же исходного файла. Но вам часто придется писать классы, которые нужно будет использовать в других проектах.
|