Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы C#.doc
Скачиваний:
58
Добавлен:
10.02.2015
Размер:
430.59 Кб
Скачать

Основы c#. Урок 13. Запись в экземпляр базового класса экземпляра производного

В переменной типа базового класса можно хранить и переменные производных класов. Например, текст метода Main из класса Test прошлого урока можно переписать следующим образом:

...

static void Main(string[] args)

{

Worker wrk1 = new Boss();

...

Здесь мы объявили переменную wrk1 типа Worker. Вот другой пример на эту же тему:

Worker wrk1;

Boss boss = new Boss();

wrk1=boss;

...

Здесь мы опять записываем в переменную wrk1 (типа Worker) переменную boss (типа Boss).

Но, несмотря на то, что мы записываем в переменную wrk1 или с помощью оператора new или посредством присваивания экземпляр производного класса, все равно методы производного класса мы использовать не можем (на самом деле из производного класса мы не сможем использовать не только методы, но и переменные)!

Например, в следущие строки выведут на экран 50, а не ноль:

wrk1.setAge(50); //Вызывается метод класса Worker, а не класса Boss

Console.WriteLine("Возраст работника " + wrk1.getAge());

Как с этим бороться, мы рассмотрим на следующем уроке, а пока поясним, почему это может оказаться важным. Например, в вашей фирме есть работники разных типов - программисты, директора, бухгалтера и т. п. Так как у все категорий работников есть что-общее, что вы можете создать базовый класс Worker и производные от него специализированные классы. Далее вы можете в вашей программе объявить массив типа Worker. Так вот, в этом массиве можно будет хранить всех работников (т. е. экземпляры всех классов, производных от класса Worker). И это удобно - одним циклом вы сможете начислить всем зарплату и т. п.

Основы c#. Урок 14. Вложенные классы

Иногда для некоторый класс играет чисто вспомогательную роль для другого класса и используется только внутри него. В этом случае логично описать его внутри существующего класса. Вот пример такого описания:

usingSystem;

namespacetest

{

classClassA

{

//Вложенный класс

private class ClassB

{

public int z;

}

//Переменная типа вложенного класса

private ClassB w;

//Конструктор

public ClassA()

{

w=new ClassB();

w.z=35;

}

//Некоторый метод

public int SomeMethod()

{

return w.z;

}

}

class Test

{

static void Main(string[] args)

{

ClassA v=new ClassA();

int k=v.SomeMethod();

Console.WriteLine(k);

}

}

}

Здесь класс ClassB объявлен внутри класса ClassA. Объявлен он со словом private, так что его экземпляры мы можем создавать только внутри класса ClassA (что мы и делаем в конструкторе класса ClassA). Методы класса ClassA имеют доступ к экземпляру класса ClassB (как, например, метод SomeMethod).

Вложенный класс имеет смысл использовать тогда, когда его экземпляр используется только в определенном классе. Кроме того, при использовании вложеных классов улучшается читаемость кода - если нас не интересует устройство основного класса, то разбирать работу вложенного класса нет необходимости.

Обратите также внимание, как вложенные классы показываются на вкладке ClassView: