7. Виртуальные методы класса. 8. Абстрактные метода и классы, пример использования абстрактных классов.. 9. Интерфейсы: пользовательские интерфейсы.
7. Виртуальные методы класса Виртуальный метод - это метод, который объявлен в базовом классе с использованием ключевого слова virtual, и затем переопределен в производном классе с помощью ключевого слова override. При этом если реализована многоуровневая иерархия классов, то каждый производный класс может иметь свою собственную версию виртуального метода. class DemoPoint //базовый класс { protected int x; protected int y; public virtual void Show() //виртуальный метод { Console. WriteLine(" точка на плоскости: ({0}, {1})", x, y); } class DemoShape: DemoPoint //производный класс { protected int z; public override void Show() //перегрузка виртуального метода { Console. WriteLine(" точка в пространстве: ({0}, {1}, {2})", x, y, z); }
8. Абстрактные метода и классы, пример использования абстрактных классов. Иногда полезно создать базовый класс, определяющий только своего рода " пустой бланк", который унаследуют все производные классы, причем каждый из них заполнит этот " бланк" собственной информацией. Такой класс определяет структуру методов, которые производные классы должны реализовать, но сам при этом не обеспечивает реализации этих методов. В данной ситуации разрабатываются абстрактные методы илицелые абстрактные классы. Абстрактный метод создается с помощью модификатора abstract. Он не имеет тела и, следовательно, не реализуется базовым классом, а производные классы должны его обязательно переопределить. Абстрактный метод автоматически является виртуальным, однако использовать спецификатор virtual не нужно. Более того, если вы попытаетесь использовать два спецификатора одновременно, abstract и virtual, то компилятор выдаст сообщение об ошибке. Если класс содержит один или несколько абстрактных классов, то его также нужно объявить как абстрактный, используя спецификатор abstract перед class.
Если производный класс наследует абстрактный, то он должен полностью переопределить все абстрактные методы базового класса или также быть объявлен как абстрактный. Таким образом, спецификатор abstract наследуется до тех пор, пока в производном классе не будут реализованы все абстрактные методы. abstract class Demo //абстрактный класс { abstract public void Show(); //абстрактный метод abstract public double Dlina(); //абстрактный метод } class DemoPoint: Demo //производный класс от абстрактного { protected int x; protected int y; public DemoPoint (int x, int y) { this. x=x; this. y=y; } public override void Show() //переопределение абстрактного метода { Console. WriteLine(" точка на плоскости: ({0}, {1})", x, y); } public override double Dlina() //переопределение абстрактного метода { return Math. Sqrt(x*x+y*y); }}
9. Интерфейсы: пользовательские интерфейсы. Интерфейс - это " крайний случай" абстрактного класса, в котором не предусмотрена ни одна реализация члена класса. Таким образом, интерфейс описывает функциональность классов, но не определяет способа ее реализации. Каждый класс, наследуя интерфейс, может реализовать его элементы по-своему. Так достигается полиморфизм - объекты разных классов по-разному реагируют на вызовы одного и того же метода. Синтаксис интерфейса: [атрибуты] [спецификаторы] interface имя_интерфейса: [предки] {//объявление функциональных членов интерфейса без реализации … } Для интерфейса могут быть указаны спецификаторы new, public, internal и private. Все функциональные члены интерфейса по умолчанию являются открытыми (public) и абстрактными (abstract), поэтому при описании метода указывается только типа возвращаемого им значения и сигнатуры. В качестве функциональных членов в интерфейсе можно объявлять сигнатуры методов, свойств, индексаторов и событий (для Windows-приложений). Интерфейсы не могут содержать члены данных, конструкторы, деструкторы или операторные методы (методы, переопределяющие операции). Ни один член интерфейса не может быть объявлен статическим.
Класс, наследующий интерфейс, должен реализовать его в полном объеме. Т. к. функциональные члены, объявленные внутри интерфейса, являются открытыми, то их реализация также должна быть открытой. Кроме того, сигнатура функционального члена в реализации должна в точности совпадать с сигнатурой, заданной в определении интерфейса. interface IDemo { void Show(); //объявление метода double Dlina(); //объявление метода int X {get; } //объявление свойства, доступного только для чтения} //класс DemoPoint наследует интерфейс IDemo class DemoPoint: IDemo { protected int x; protected int y; public DemoPoint ( int x, int y) { this. x=x; this. y=y; } public void Show() //реализация метода, объявленного в интерфейсе { Console. WriteLine(" точка на плоскости: ({0}, {1})", x, y); } public double Dlina() //реализация метода, объявленного в интерфейсе { return Math. Sqrt(x*x+y*y); } public int X //реализация свойства, объявленного в интерфейсе { get { return x; } }
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|