ПредишенСледващото

Виртуални методи и наследена

Делфи има необичайно богата езикова поддръжка на полиморфна поведение. Най-прости и основни, които повечето програмисти, свързани с полиморфизъм - виртуални методи.

Виртуалната метод е обявена в своя база клас с виртуална директива. В базовия клас може да има изпълнение по подразбиране за един виртуален метод, или не може да има. Ако изпълнението по подразбиране не е, тогава ще отбележат метод като абстрактно (абстрактен директива), принуждавайки наследници клас, за да създадете своя собствена реализация на метода е задължително. Всичко това - основните неща, които всеки знае Delphi програмисти. В зависимост от изпълнението (и документация!) База клас, който наследява от класа може да реши да се обади на наследен метод в началото, преди изпълнението на действията, или в средата (рядко) или след действията си, в крайна сметка, или не предизвика всички , Има два начина да се наричат ​​метод наследил варианти, с минимални разлики: Този код със сигурност предизвикват наследен метод Draw базов клас. Ако методът в базовия клас - абстрактен, обаждането се провали, вълнуващо EAbstractError изключение по време на изпълнение (или Run-Time грешка 210, ако не се използват изключения).

Алтернативен синтаксис повикване - просто напишете наследи. например: Този код ще работи по същия начин с предишните случаи, в които на базовия клас не съдържат абстрактен метод. Този код също автоматично създава средство за код на завършване, когато се приложи метод за замяна (замяна). В допълнение, той също използва IDE, когато поставите форма манипулатор събития с визуално наследство.

Ако метода на базовия клас е абстрактно, или като на базовия клас не съдържа метод (за не-виртуални методи), поканата получава наследил noop (No-Операция - Нека оператора). Компилаторът не генерира код за него (така че да не може да го постави на точка на прекъсване). Този механизъм е част от отлична стабилност на езика Delphi версийте.

Един капан с синтаксис наследи; - тя не се поддържа за функциите. За функциите, които трябва да използвате изрично синтаксис с името на метода и неговите аргументи. Например: Това може да изглежда като прекомерно ограничаване на език дизайна на Delphi, но аз мисля, че това не е случайно. Смисълът на това е вероятно, че ако TMyClass.MethodC е абстрактен (или ще бъдат направени в бъдеще абстрактно), резултатите от задача в потомък класа на повикване Резултати ще бъдат премахнати, което ще доведе до неочакван неопределена стойност. Това, разбира се, ще доведе до скрити грешки в кода си.

Въпреки това, аз мисля, че има малка разлика в синтаксиса наследил повикването. В много отношения, процедура, която отнема от параметрите (а в някои случаи и VAR параметри), се държи като функция, която връща резултат. Така че, по мое мнение, по Наследено синтаксис; Тя трябва да бъде забранено, когато се обаждате методи навън (и евентуално, VAR) параметри. Сега това не е така. Този код означава, че ако родителския клас е абстрактен (или просто не съществува в случай на неспазване виртуален метод), а след това стойността на продукцията, параметър е несигурно. По мое мнение, компилаторът трябва да се забрани на тези предизвикателства, наследени. изискваща изрично синтаксис наследени MethodB (A); Но котката вече е освободен от чантата и тя е твърде късно да се промени нищо - блокиране на такива повиквания с компилация грешки със сигурност ще се прекъсне един куп код, така че е вероятно привлича най-много предупреждение (предупреждение).

Не знаех как да се използва виртуална * * упс директива

Благодарим ви за вашата статия разбираемо. )

Един капан с синтаксис наследи; - тя не се поддържа за функциите. За функциите, които трябва да използвате изрично синтаксис с името на метода и неговите аргументи
Честно казано - за първи път чувам за това. Наслаждавах се на този синтаксис и D7 и сега - няма ограничения. И дори си например съставя глоба и работи както се очаква

Аз разбирам, че копие на старите статии от списанието Delphi (може и да греша, разбира се). Но във всеки случай, оригиналът е написан, както изглежда, доста дълго време. Ако не греша, това поведение е да Delphi 4, включително и в Делфи 5 е била премахната.

Текст, решава да напусне, за да проучи проблема с функция за абстрактен метод. Въпреки, че сега разбирам, че това е необходимо, за да добавите бележка.

Един капан с синтаксис наследи; - тя не се поддържа за функциите.
В Delphi XE така. Vlob трябва да напишете:
Резултат: = наследи;
В противен случай стойността на базовия клас не се предават.

Можете да използвате някои HTML маркери, например:

Моля, ако е възможно, да се използва "Име / URL адреса" вместо "анонимен". URL просто може да се пропусне.

Вашето съобщение може да бъде маркирана като спам от филтъра за спам - не се притеснявайте, тя ще се появи след проверка.

Търсене на блог

Подкрепете проекта - споделете линка, благодаря!