- •Обзор элементов класса.
- •Класс Object
- •Структуры
- •Методы Ссылочные параметры ref и out
- •Переменное число аргументов метода
- •Перегрузка методов. Вызов методов с одинаковым именем и разными аргументами
- •Конструкторы экземпляра
- •Вызов конструктора экземпляра
- •Закрытые конструкторы экземпляра
- •Статические конструкторы
- •Конструкторы структур
- •Член со спецификатором readonly
- •Деструкторы. Сборка мусора
- •Объект Account
- •Объект Account недоступен
- •Свойства
- •Индексаторы
- •Предпосылки появления наследования
- •Синтаксис наследования.
- •Типы наследования
- •Множественное наследование
- •Наследование интерфейса
- •Виртуальные методы
- •Спецификаторы доступности
- •Вызов базовых версий функций
- •Абстрактные классы и функции
- •Структуры и наследование
- •Полиморфизм
- •Потеря и восстановление информации о типе
- •Операции is и as
- •Файловый ввод-вывод
- •Потоки данных и файловый ввод-вывод
- •Виды файлов
- •Классы файлового ввода-вывода
- •Класс FileInfo
- •Текстовый ввод-вывод при помощи Stream Reader и Stream Writer
- •Бинарный ввод и вывод при помощи класса FileStream
Синтаксис наследования.
Синтаксис для получения производного класса из базового показан в синтаксическом блоке В заголовке производного класса указаны все необязательные спецификаторы, за которыми следует ключевое слово class и имя класса. Важно при этом двоеточие (:), за которым следует имя базового класса. Его смысл эквивалентен "является производным от" или "наследует от".
Определение_класса_с_необязательным_наследованием::= [<Спецификатор_доступности>] class <Имя_производного_класса> [ : <Имя_базового_класса>]
{
<Элементы_производного_класса>
}
using System;
class Student
{
private string name;
private string surname;
private byte age=0;
public string Name
{
get
{
return name;
}
set
{
name=value;
}
}
public string Surname
{
get
{
return surname;
}
set
{
surname=value;
}
}
public byte Age
{
get
{
return age;
}
set
{
age=value;
}
}
class GraduateStudent:Student
{
private byte min;
public byte GraduateStudentMIN
{
get
{
return min;
}
set
{
min=value;
}
}
}
class Test
{
public static void Main()
{
Student Student1=new Student();
GraduateStudent GraduateStudent1=new GraduateStudent();
Student1.Name="Джон";
Student1.Surname="Матвеев";
Student1.Age=20;
Console.WriteLine("Имя: {0} Фамилия: {1} Возраст: {2}", Student1.Name, Student1.Surname, Student1.Age);
GraduateStudent1.Name="Алексей";
GraduateStudent1.Surname="Лосев";
GraduateStudent1.Age=26;
GraduateStudent1.GraduateStudentMIN=14;
Console.WriteLine("Имя: {0} Фамилия: {1} Возраст: {2} Кандидатский минимум: {3}", GraduateStudent1.Name, GraduateStudent1.Surname, GraduateStudent1.Age, GraduateStudent1.GraduateStudentMIN);
Console.ReadLine();
}
} }
Типы наследования
Существуют два различных типа наследования: наследование реализации и наследование интерфейса.
Наследование реализации (implementation inheritance) означает, что тип происходит от базового типа, получая от него все поля-члены и функции. При наследовании реализации производный тип адаптирует реализацию каждой функции базового типа, если только в его определении не указано, что реализация функции должна быть переопределена. Такой тип наследования более полезен, когда нужно добавить функциональность существующему типу, или же когда несколько связанных типов разделяют существенный объем общей функциональности. Хороший пример — набор классов Windows Forms, наряду с базовым классом System.Windows.Forms.Control, который представляет очень сложную реализацию общего элемента управления Windows, и многочисленными другими классами, такими как System.Windows.Forms.TextBox и System.Windows.Forms.ListBox, унаследованными от Control и переопределяющими его функции или определяющими новые функции для реализации специальных элементов управления.
Наследование интерфейса (interface inheritance) означает, что тип наследует только сигнатуру функций, но не наследует никакой реализации. Этот тип наследования наиболее полезен, когда нужно специфицировать, что тип обеспечивает доступ к определенным средствам. Например, для некоторых типов может быть указано, что они представляют метод очистки ресурсов, называемый Dispose(), за счет того, что наследуют интерфейс System.Idisposable. Поскольку способ, которым один тип очищает ресурсы, скорее всего, будет очень отличаться от способа очистки ресурсов, используемого другим типом, нет смысла определять никакой общей реализации, а потому в данном случае подходит наследование интерфейса. Наследование интерфейса часто трактуется как выполнение контракта: наследуя интерфейс, тип берет на себя обязанность представить клиентам определенную функциональность.