Interface iMan { string Name { get; set; }
}
public class People : IMan {
private string name; public string Name { get {return name; } set {name = value; } }
public People() {name = «no name»;} }
Головная программа:
People e1 = new People(); e1.Name = “Иванов Иван;” System.Console.WriteLine(«People name: {0}», e1.Name);
8. Модификаторы доступа
Все члены класса - поля, методы, свойства - все они имеют модификаторы доступа. Модификаторы доступа позволяют задать допустимую область видимости для членов класса. То есть контекст, в котором можно употреблять данную переменную или метод. В предыдущей теме мы уже с ними сталкивались, когда объявляли поля класса Book публичными (то есть с модификатором public).
В C# применяются следующие модификаторы доступа:
public: публичный, общедоступный класс или член класса. Такой член класса доступен из любого места в коде, а также из других программ и сборок.
private: закрытый класс или член класса. Представляет полную противоположность модификатору public. Такой закрытый класс или член класса доступен только из кода в том же классе или контексте.
protected: такой член класса доступен из любого места в текущем классе или в производных классах.
internal: класс и члены класса с подобным модификатором доступны из любого места кода в той же сборке, однако он недоступен для других программ и сборок (как в случае с модификатором public).
protected internal: совмещает функционал двух модификаторов. Классы и члены класса с таким модификатором доступны из текущей сборки и из производных классов.
int a; // все равно, что private int a;
private int b; // поле доступно только из текущего класса
protected int c; // доступно из текущего класса и производных классов
internal int d; // доступно в любом месте программы
protected internal int e; // доступно в любом месте программы и из классов-наследников
public int f; // доступно в любом месте программы, а также для других программ и сборок
private void Display_f()
{
Console.WriteLine("Переменная f = {0}", f);
}
public void Display_a()
{
Console.WriteLine("Переменная a = {0}", a);
}
internal void Display_b()
{
Console.WriteLine("Переменная b = {0}", b);
}
protected void Display_e()
{
Console.WriteLine("Переменная e = {0}", e);
}
}
9. Сокрытие имен. Операторы this и base.
В языке C# имеется ключевое слово this, которое обеспечивает доступ к текущему экземпляру класса. Одно из возможных применений ключевого слова this состоит в том, чтобы разрешать неоднозначность контекста, которая может возникнуть, когда входящий параметр назван так же, как поле данных данного типа. Разумеется, в идеале необходимо просто придерживаться соглашения об именовании, которое не может привести к такой неоднозначности.
class MyClass
{
public char ch;
// 2 метода использующие входной параметр ch, при
// этом во втором методе используется ключевое слово this
public void Method1(char ch)
{
ch = ch;
}
public void Method2(char ch)
{
this.ch = ch;
}
}
class Program
{
static void Main()
{
char myCH = 'A';
Console.WriteLine("Исходный символ {0}",myCH);
MyClass obj = new MyClass();
obj.Method1(myCH);
Console.WriteLine("Использование метода без ключевого слова this: {0}", obj.ch);
obj.Method2(myCH);
Console.WriteLine("Использование метода c ключевым словом this: {0}", obj.ch);
Console.ReadLine();
}
}
Ключевое слово base используется для доступа к членам базового класса из производного класса:
Вызов метода базового класса, который был переопределен другим методом.
Определение конструктора базового класса, который должен вызываться при создании экземпляров производного класса.
Доступ к базовому классу разрешен только в конструкторе, методе экземпляра или методе доступа экземпляра.
Использование ключевого слова base в статическом методе является недопустимым.
Базовый
класс, к которому осуществляется доступ,
является базовым классом, заданным в
объявлении класса. Например,
если указать class
ClassB : ClassA,
члены ClassA будут доступны из ClassB, независимо
от базового класса ClassA
public class Person
{
protected string ssn = "444-55-6666";
protected string name = "John L. Malgraine";
public virtual void GetInfo()
{
Console.WriteLine("Name: {0}", name);
Console.WriteLine("SSN: {0}", ssn);
}
}
class Employee : Person
{
public string id = "ABC567EFG";
public override void GetInfo()
{
// Calling the base class GetInfo method:
base.GetInfo();
Console.WriteLine("Employee ID: {0}", id);
}
}
class TestClass
{
static void Main()
{
Employee E = new Employee();
E.GetInfo();
}
}
производном классе можно определить член с таким же именем, как и у члена его базового класса. В этом случае член базового класса скрывается в производном классе. И хотя формально в C# это не считается ошибкой, компилятор все же выдаст сообщение, предупреждающее о том, что имя скрывается. Если член базового класса требуется скрыть намеренно, то перед его именем следует указать ключевое слово new, чтобы избежать появления подобного предупреждающего сообщения. Следует, однако, иметь в виду, что это совершенно отдельное применение ключевого слова new, не похожее на его применение при создании экземпляра объекта. Ниже приведен пример сокрытия имени. // Пример сокрытия имени с наследственной связью. using System; class А { public int i = 0; } // Создать производный класс. class В : А { new int i; // этот член скрывает член i из класса А public В(int b) { i = b; // член i в классе В } public void Show() { Console.WriteLine("Член i в производном классе: " + i) ; } } class NameHiding { static void Main() { В ob = new В(2); ob. Show () ; } } Прежде всего обратите внимание на использование ключевого слова new в следующей строке кода: new int i; // этот член скрывает член i из класса А В этой строке, по существу, компилятору сообщается о том, что вновь создаваемая переменная i намеренно скрывает переменную i из базового класса А и что автору программы об этом известно. Если же опустить ключевое слово new в этой строке кода, то компилятор выдаст предупреждающее сообщение. Вот к какому результату приводит выполнение приведенного выше кода: Член i в производном классе: 2 В классе В определяется собственная переменная экземпляра i, которая скрывает переменную i из базового класса А. Поэтому при вызове метода Show () для объекта типа В выводится значение переменной i, определенной в классе В, а не той, что определена в классе А.
