Особенности ООП Delphi for DotNet
Чтобы подстроится под DotNet, внесены изменения в ООП Delphi:
1. Производный класс не TObject, а System.Object.( TObject переименованный System.Object).
2. Запрещены нетипизированные указатели и другие типы данных, которые напрямую обращаются к памяти.
3. Запрещён тип Variant (рекомендуется создавать вспомогательный класс и приводить его к типу TObject).
4. Недопустимы множества.
5. Небезопасный код – код включающий указатели(начиная с Delphi7). Чтобы включить небезопасный код в приложение надо ввести директиву, что далее небезопасный код {$UnsafeCodeOn}, целые подпрограммы следует помечать словом Unsafe.
6. Цикл:
For In <диапазон> Do <оператор>
7. Var Ar:Array of Array of Real;
8. Введены статические поля
T=Class(TObject)
I:Integer;
Class Var
Il:Integer;
Str:string;
End;
9. Типы методов
Обычные методы, классовые методы, динамические и виртуальные.
10. Возможность использовать директиву inline (как в С++)
11. Уничтожение классов с помощью метода Finalize (его вызывает еще сборщик мусора). Finalize можно переопределить, дополнив своим кодом.
12. Могут быть объявлены статические свойства.
13. События могут быть одиночные и многоадресные (Include и exclude)
14. Добавлен спецификатор видимости Strict Private (доступ только внутри класса)
Вспомогательный класс
Позволяет дополнить класс практически не меняя его.
Type
TFoo=Class
Procedure AProc;
End;
TFooHelper=Class Helper for TFoo
Procedure AHelperProc
End;
Совместимость с другими языками
Для совместимыми с другими языками, поддерживающими DotNet, при объявлении класса можно указать директиву abstract (т.е. нельзя создавать экземпляры этого класса, а методы реализовывать надо) или sealed (запечатанные)(когда запрещается его наследование). Т.е. теперь можно объявить так:
Type <имя класса>=class |abstract| sealed |
End;
Т.е. допустимы два дополнительных предшествующих слова абстрактный либо запечатанный.
Вложенные типы и константы данных
Допускается включение директивы Type внутри объявления класса, тем самым вкладывая объявление внутрь класса Nesting Type. А также включение директивы Constant (примечание лектора: такая возможность есть, но не понятно зачем она нужна).
Type TOUTClass=Class
Procedure SomeOUTProcType TINClass=Class //вложенный класс
Procedure SomeINProc //вложенная процедура
End;
End;Var OUTvar: TOUTClass.TINClass;
Перегрузка отдельных операторов классов и записей для среды Net
Допустимо только для DotNet:
Type
Ovcerloadspos=Class
Private
FFiled:Integer;
Public
Class operator
Add(A,B:Overloadspos):Overloadsops;
Class operator Substract(A,B:Overloadspos):Overloadsops;
End;
Дальше надо написать их реализацию.
В данном случае можно сделать сложение или вычитание и т.п. Отличие от обычных функций: для среды DotNet только. Здесь при сложении разные типы получаются. Иначе надо было бы много раз писать (что бы их перегружать).
Атрибуты DotNet
Одной из наиболее интересных возможностей DotNet является реализация разработки ориентированной на атрибуты, что позволяет унифицировать языков программирования, которые различались в прошлом существенно. Атрибуты предоставляют средства, позволяющие указать метаданные с таким элементами языка как классы, свойства, методы и т.п. Атрибуты пишутся в квадратных скобках перед аргументируемым элементом.
[dllImport user32.dll]
Дальше можно объявить функцию, которая была добавлена как External.
Function MessageBip(NType:LongWORD):Boolean; external;
Указана как атрибут. Поскольку атрибуты модернизованы как классы допускается их модернизация и всякого рода расширение.
Интерфейсы DotNet
Встроенная поддержка интерфейсов осталась, но теперь интерфейсы
• не происходят напрямую от IUnknown(или его другое название IInterface).
• не реализуют методов QueryInterface, AddRef, Release.
• подсчет ссылок встроен в саму среду (в сборщик мусора)
• директива Implement отсутствует, т.е. конгломераты строить нельзя.
Т.е. интерфейсы формально ещё остались, поскольку классы от них происходят, другое дело, поскольку всё реализовано, то вам интерфейсы реализовывать не приходиться. Нет единого интерфейса прародителя. Поскольку общей идеи подсчета ссылок нет, интерфейс можно просто назвать и сделать его начальным.