- •Обзор элементов класса.
- •Класс Object
- •Структуры
- •Методы Ссылочные параметры ref и out
- •Переменное число аргументов метода
- •Перегрузка методов. Вызов методов с одинаковым именем и разными аргументами
- •Конструкторы экземпляра
- •Вызов конструктора экземпляра
- •Закрытые конструкторы экземпляра
- •Статические конструкторы
- •Конструкторы структур
- •Член со спецификатором readonly
- •Деструкторы. Сборка мусора
- •Объект Account
- •Объект Account недоступен
- •Свойства
- •Индексаторы
- •Предпосылки появления наследования
- •Синтаксис наследования.
- •Типы наследования
- •Множественное наследование
- •Наследование интерфейса
- •Виртуальные методы
- •Спецификаторы доступности
- •Вызов базовых версий функций
- •Абстрактные классы и функции
- •Структуры и наследование
- •Полиморфизм
- •Потеря и восстановление информации о типе
- •Операции is и as
- •Файловый ввод-вывод
- •Потоки данных и файловый ввод-вывод
- •Виды файлов
- •Классы файлового ввода-вывода
- •Класс FileInfo
- •Текстовый ввод-вывод при помощи Stream Reader и Stream Writer
- •Бинарный ввод и вывод при помощи класса FileStream
Спецификаторы доступности
Спецификаторы доступности особенно важны для наследования. На данный момент мы сталкивались со спецификаторами доступности private и public. Далее рассмотрим несколько новых спецификаторов доступности:
-
internal – доступ к элементу возможен только из сборки в которой он объявлен;
-
protected – элемент класса доступен из класса, в котором он объявлен и его производных классов.
-
protected-internal – элемент класса обладающий этим спецификатором доступен только из того класса, где он объявлен, из производного класса или из сборки в которой он определен.
Согласно принципу инкапсуляции все переменные экземпляра должны быть объявлены как private. Для работы с ними используются свойства, который в базовом классе объявляются как protected.
class class1
{
private int a=0;
protected int A
{
set
{
a = value;
}
get
{
return a;
}
}
}
class class2: class1
{
public void get()
{
A = 20;
Console.WriteLine(A);
}
}
}
class Program
{
static void Main(string[] args)
{
class2 my_class2 = new class2();
my_class2.get();
Console.ReadLine();
}
}
Вызов базовых версий функций
В С# предусмотрен специальный синтаксис вызова базовых версий метода из производного класса: base.<MethodName> ( ). Например, если необходимо, чтобы метод производного класса возвращал значение в 5 раз большее чем, метод базового класса, можно воспользоваться следующим синтаксисом:
class class1
{
private int a=10;
public virtual int get _a()
{
return a;
}
}
class class2: class1
{
public override int get_a()
{
return base. get _a() * 5;
}
}
class Program
{
static void Main(string[] args)
{
class1 my_class1 = new class1();
class2 my_class2 = new class2();
Console.WriteLine(my_class1. get _a());
Console.WriteLine(my_class2. get _a());
Console.ReadLine();
}
}
Отметим, что синтаксис base.<MethodName> () можно использовать для вызов любого метода базового класса — вы не обязаны вызывать его только из переопределенной версии того же метода.
Абстрактные классы и функции
Язык С# позволяет объявлять абстрактными и классы и функции. Нельзя создавать экземпляры абстрактных классов, в то время как абстрактные функции не имеют реализации и должны быть переопределены в любом неабстрактном классе-наследнике. Очевидно, что абстрактные функции автоматически являются виртуальными (хотя вы не должны применять ключевое слово virtual, так как это приведет к синтаксической ошибке). Если любой класс содержит любую абстрактную функцию, этот класс сам является абстрактным и должен быть объявлен таковым.
abstract class class1
{
public int a, b;
public class1()
{
Console.WriteLine("ВВедите числа");
a = Convert.ToInt32(Console.ReadLine());
b = Convert.ToInt32(Console.ReadLine());
}
public abstract void sum(int c, int d);
}
class class2 : class1
{
public override void sum(int c, int d)
{
int q = c + d;
Console.WriteLine("Сумма равна" + q);
}
}
class Program
{
static void Main(string[] args)
{
class2 myClass2 = new class2();
myClass2.sum(myClass2.a, myClass2.b);
Console.ReadLine();
}
}
Для создания абстактного метода необходимо в заголовок метода добавить ключевое слово abstract. Абстрактые классы не могут иметь объектов т.к. его методы не имеют реализации.