Сравнение языков программирования (esyr) (1161143), страница 8
Текст из файла (страница 8)
Кому интересно, брал здесь.Наследование типов и классов[править]C# и Java[править]В C# и Java можно в дочернем классе сослаться на экземпляр родительского с помощ ью ключевых слов base (C#) и super (Java).Кроме того, в этих языках есть ключевые слова sealed (C#) и final (Java). Они могут находиться в заголовке[10] метода (в случае C# — только виртуального) иликласса (final также может находиться в описании поля, но это «другая песня»).open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.comВ C# sealed в заголовке виртуального метода означает запрет перегрузки (англ. override) метода в производных классах.
В заголовке класса — запретнаследования от данного класса.В Java final в заголовке метода означает, запрет замещ ения (скрытия, англ. hide) или перегрузки (англ. override) метода в производных классах. В заголовкекласса — запрет наследования от данного класса.ADA[править]Наследование в Аде происходит путем создания нового пакета и расширения в нем базовой записи:package Person istype Object is tagged private;procedure Put (O : Object);privatetype Object isrecordName: String (1 .. 10);Gender : Gender_Type;end record;end Person;with Person;package Programmer istype Object is new Person.Object with private;privatetype Object isrecordabuility: Language_List;end record;end Person;ООП в Аде является вполне полноценным c Динамическим полиморфизмом, RTTI , абстрактными типами и интерфейсами.Динамический полиморфизм[править]В объектно-ориентированных языках программирования динамический полиморфизм реализуется с помощ ью наследования классов и виртуальных функций и/или виртуальных членов.
Класс-потомок наследует сигнатуры методов класса-родителя, а реализация, в результате переопределения метода, этих методовможет быть другой, соответствующ ей специфике класса-потомка. Другие функции могут работать с объектом как с экземпляром класса-родителя, но если приэтом объект на самом деле является экземпляром класса-потомка, то во время исполнения будет вызван метод, переопределенный в классе-потомке.
Этоназывается поздним связыванием.Позднее связывание есть в C++, C#, Java, Delphi, Ада 95, Оберон-2.C#[править]В C# к динамическому полиморфизму имеют отношение 3 важных ключевых слова (модификатора):1. virtual2. override3. newvirtual[править]Ключевое слово virtual используется для изменения объявлений методов, свойств, индексаторов и событий и разрешения их переопределения в производномклассе. Например, этот метод может быть переопределен любым производным классом. Модификатор virtual нельзя использовать с модификаторами static,open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.comabstract, private или override.public virtual double Area(){return x * y;}override[править]Модификатор override требуется для расширения или изменения абстрактной или виртуальной реализации унаследованного метода, свойства, индексатора илисобытия.
Иными словами, модификатор override расширяет метод базового класса. Метод, переопределенный c использованием override, называетсяпереопределенным базовым методом. Переопределенный базовый метод должен иметь ту же сигнатуру, что и метод override. Невиртуальный или статическийметод нельзя переопределить. Переопределенный базовый метод должен иметь тип virtual, abstract или override. Объявление override не может изменитьуровень доступа метода virtual. Методы override и virtual должны иметь одинаковый модификатор уровня доступа. Модификаторы new, static и virtual нельзяиспользовать для изменения метода override. Переопределяющ ее объявление свойства должно задавать такие же модификаторы уровня доступа, тип и имя, каки имеющ иеся у унаследованного свойства, а переопределенное свойство должно иметь тип virtual, abstract или override.class BaseClass{public virtual void Method1(){Console.WriteLine("Base - Method1");}public void Method2(){Console.WriteLine("Base - Method2");}}class DerivedClass : BaseClass{public override void Method1(){Console.WriteLine("Derived - Method1");}public void Method2(){Console.WriteLine("Derived - Method2");}}// ...BaseClass bc = new BaseClass();DerivedClass dc = new DerivedClass();BaseClass bcdc = new DerivedClass();bc.Method1();bc.Method2();dc.Method1();dc.Method2();bcdc.Method1();bcdc.Method2();// Output:// Base - Method1// Base - Method2// Derived - Method1// Derived - Method2// Derived - Method1// Base - Method2new[править]Модификатор new скрывает члены, унаследованные от базового класса.
При сокрытии унаследованного члена его производная версия заменяет версиюбазового класса. (На самом деле, члены можно скрыть и без модификатора new, но в результате возникнет предупреждение. Если же для явного скрытия членаopen in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.comиспользуется new, то модификатор отключает вывод предупреждений и документирует тот факт, что производная версия предназначена для замены.class BaseClass{public void Method1(){Console.WriteLine("Base - Method1");}public void Method2(){Console.WriteLine("Base - Method2");}}class DerivedClass : BaseClass{public override void Method1(){Console.WriteLine("Derived - Method1");}public new void Method2(){Console.WriteLine("Derived - Method2");}}// ...BaseClass bc = new BaseClass();DerivedClass dc = new DerivedClass();BaseClass bcdc = new DerivedClass();bc.Method1();bc.Method2();dc.Method1();dc.Method2();bcdc.Method1();bcdc.Method2();// Output:// Base - Method1// Base - Method2// Base - Method1// Derived - Method2// Base - Method1// Base - Method2Абстрактные типы данных, классы и интерфейсы[править]Абстрактный тип данных (АТД) — это тип с полностью инкапсулированной структурой.
Использовать объекты АТД возможно только при помощ и явноопределенных в интерфейсе типа операций. Абстрактный класс (АК) — это класс, содержащ ий хотя бы один абстрактный метод. Он предназначен только длятого, чтобы быть базовым классом.Прямой связи между АК и АТД нет. АТД может быть абстрактным классом, а может и не быть. Аналогично, АК может иметь инкапсулированную структуру, аможет и не иметь.Абстрактный класс[править]В объектно-ориентированных языках программирования абстрактный класс реализуются следующими тремя способами1.
Модификатор abstract перед классом. Используется в C# и Java.2. Класс содержит хотя бы один абстрактный метод. В C# и Java абстрактный метод обозначается модификатором abstract перед объявлением метода. В C++абстрактные методы называются чистыми виртуальными. Примеры:// тело отсутствуетvirtual void draw() = 0; // C++abstract void draw(); // Java, C#open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.com3.
Если в классе, производном от абстрактного класса с абстрактными методами, не замещ ен хотя бы один абстрактный метод, то класс тоже являетсяабстрактным. В C# и Java незамещ енные абстрактные методы должны быть явно объявлены как абстрактные.В языке C# абстрактными могут быть и свойства:abstract int Length { get;}Пример абстрактного класса (Java или C#):abstract class ShapesClass{abstract public int Area();}Абстрактные методы (функции) есть в C++, Java, Delphi, C#, Ада 95.Абстрактный тип данных[править]В большинстве языков абстрактный тип данных реализуется с помощ ью интерфейсов. См. пример в соответствующ ем разделе.В Ада используется ключевое слово limited:type Stack is limited private;В ОБЕРОН И ОБЕРОН-2 АТД позволяют открывать поля структуры.Пример абстрактного ТД и абстрактных функций в Ада95[править]Мы продемонстрируем абстрактные классы, описывая несколько реализаций одной и той же абстракции; абстрактный класс будет определять структуру данныхSet, и производный класс — реализовывать множество в виде булевого массива.
В языке Ada 95 слово abstract обозначает абстрактный тип и абстрактныеподпрограммы, связанные с этим типом:package Set_Package istype Set is abstract tagged null record;function Union(S1, S2: Set) return Set is abstract;function Intersection(S1, S2: Set) return Set is abstract;end Set_Package;Вы не можете объявить объект абстрактного типа и не можете вызвать абстрактную подпрограмму. Тип служит только каркасом для порождения конкретныхтипов, а подпрограммы должны замещ аться конкретными подпрограммами.Рассмотрим производный тип, в котором множество представлено булевым массивом:with Set_Package;package Bit_Set_Package istype Set is new Set_Package.Set with private;function Union(S1, S2: Set) return Set;function lntersection(S1, S2: Set) return Set;privatetype Bit_Array is array(1..100) of Boolean;type Set is new Set_Package.Set withrecordData: Bit_Array;end record;end Bit_Set_Package;open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.comКонечно, необходимо тело пакета, чтобы реализовать операции.Интерфейс[править]Интерфейс состоит только из абстрактных методов.
В нем нет реализации методов (как нет и невиртуальных методов), нет нестатических полей (статические поля,например константы, допустимы).Пример моделирования интерфейса на C++:class Set {public:virtual void Incl(T & x) = 0virtual void Excl(T & x) = 0virtual bool IsIn(T & x) = 0};virtual ~Set () {} // деструкторЯвная и неявная реализация интерфейса[править]Явная реализация интерфейса означает, что вызов метода интерфейса может происходить только через ссылку на интерфейс, но не может происходить черезссылку на класс, реализующ ий интерфейс. Перед вызовом интерфейсного метода необходимо явно преобразовать ссылку на объект реализующ его класса кссылке на интерфейс. Концепция явной реализации полезна, например, при конфликте имен между унаследованными интерфейсами.
Используется только в С#.Явная реализация всегда статична, неявная же может быть виртуальной. Неявная реализация может быть абстрактной и реализовываться только в классепотомке. Явная реализация не может быть абстрактной, но сам класс может иметь другие абстрактные методы и сам быть абстрактным.interface ISomeInterface{void F();}class CoClass: ISomeInterface{void ISomeInterface.F() { //в случае неявного интерфейса, здесь стояло бы public void F() {System.Console.WriteLine(“Явно реализованный метод”);}// ...}// ...CoClass c = new CoClass();c.F(); // ошибка: нельзя вызывать явно реализованный метод// интерфейса через ссылку на объект((ISomeInterface)c).F(); // все нормальноМножественное наследование[править]Полностью реализовано только в C++.