Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ЛИПО .doc
Скачиваний:
0
Добавлен:
06.12.2018
Размер:
441.86 Кб
Скачать

Спецификаторы доступности

Спецификаторы доступности особенно важны для наследования. На данный момент мы сталкивались со спецификаторами доступности 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. Абстрактые классы не могут иметь объектов т.к. его методы не имеют реализации.