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

Напишете със свои думи, надявам се, по достъпен начин за обикновения читател.

Така че, нека да кажем, че имаме няколко класа: TSomeType1 и TSomeType2. който обяви в SomeUnit.pas. И да кажем, че тези класове имат един и същ набор някои свойства и методи, но тези свойства и методи не са обявени в техния общ прародител. Например, нека да бъде така:

Тук ние виждаме метод DoSomething. които имат двата класа. Но това са два различни метода.

Съвет: И нека да кажем, че не можем да направим промени в SomeUnit.pas. Важно е да се разбере защо това е подходът, който описвам.

Да предположим сега, че имаме предизвикателство. напиши клас, който ще работи с копия на нашите класове, които ги предизвикват DoSomething (за някои събития). И тъй като TSomeType1 и TSomeType2 - това са различни класове, ние трябва да напише две нови класове. Наричаме ги Т1 и Т2, съответно. Как може да се направи? Ами, например, в челото (File MyUnit.pas):

Съвет: Има DoSomething разговор се случва само веднъж в Т1 конструктор класове и Т2. Това не е практично, но това е само един пример, който искам да покажа описаната техника.

И да го използва в код, подобен на този:

Сега си представете, че Т1 и Т2 нашите класове да направят много повече работа. Т.е. кодът ще бъде повече. Но в същото време, кодът ще бъде същото. Очевидна - код дублиране. Как да се избегне това?

Идеята на първо място - обобщение

Нека се опитаме да обобщим. те - генеричните лекарства. Нашите MyUnit.pas ще изглежда така:

Но, за съжаление, този код няма да се компилира. Защото за FObject.DoSomething линия компилация трябва да знаете, че DoSomething метода имат тип Т. и компилаторът знае просто не могат. И аз не съм намерил начини това по никакъв начин да се определи. Можете да определя изрично кой клас трябва да бъде наследен тип Т. или някакъв вид интерфейс T трябва да поддържа. Но в този случай, не е подходящо (не можем да направим промени в SomeUnit.pas, помниш ли?).

Втората мисъл - код на шаблони

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

Съвет: Ако не ми е ясно какво се случва, а след това просто да замени съдържанието X.inc файлове в A.pas и B.pas файлове вместо директиви. И вие виждате какво се случи на два пълни модул.

Съвет: Строго погледнато, дублирането на изпълним код (както и генеричните лекарства), ние не избяга. При съставяне на нашия пример файл с включени половина ще бъде заменен. Но ние успяхме да се избегне дублирането на ниво изходен код - и това е, от време на време, е на стойност много.

След това, трябва да се пренапише MyUnit.pas модула, той ще бъде като този:

И ние можем да го използваме по същия начин, както бе показано по-горе.

Защо го правим

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

Например, в VCL е TCombobox компонент. В режим Стил = csSimple или Style = csDropdown тя работи като нормален TEdit. И TCombobox и TEdit има набор от подобни свойства: MAXLENGTH. SelStart. SelLength. SelText т.н. Но тези качества не са обявени в техния общ предшественик (TWinControl), и по класове и TCustomComboBox TCustomEdit съответно.

В предишна статия описах как може да промени малко поведението по подразбиране на имота MAXLENGTH на наследниците на TCustomEdit (т.е. TEdit. TMemo и т.н.). А за това, че може да се приложи, за да TCustomComboBox - използвайте техниката, описана по-горе.

Delphi отбелязва шаблони в Делфи (но не и генеричните лекарства)

Плюсовете и минусите на тази техника

  • Решихме да особен проблем, когато не можете да (или не искат да) да прави промени в изходния код на библиотека от трета страна.
  • Ние се избягва дублирането на код.
  • Когато се въвеждат кода в вкл-файл трябва да бъде малко по-въображение от обичайното, за да излезе с имена за файловете и заместими видове, и си представете как ще изглежда в края на краищата.
  • Специализираното логическо устройство, работа с включени файлове не знае предварително, което поставя вкл-файлът ще бъде заместен. В резултат на това - няма работа CodeInsight. не може да има проблеми с рефакториране и автоматично форматиране на код.

И такъв нюанс. Debugger с включени файлове работи по същия начин, както при конвенционалните па-файл. Но (както при генеричните лекарства) поставяне на прекъсване в вкл-файл, това е точка от и за Т1 и Т2. Решен чрез определяне на условията за точка на пречупване, например: Self е T1.

Свързани статии

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