Напишете със свои думи, надявам се, по достъпен начин за обикновения читател.
Така че, нека да кажем, че имаме няколко класа: 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 - използвайте техниката, описана по-горе.
Плюсовете и минусите на тази техника
- Решихме да особен проблем, когато не можете да (или не искат да) да прави промени в изходния код на библиотека от трета страна.
- Ние се избягва дублирането на код.
- Когато се въвеждат кода в вкл-файл трябва да бъде малко по-въображение от обичайното, за да излезе с имена за файловете и заместими видове, и си представете как ще изглежда в края на краищата.
- Специализираното логическо устройство, работа с включени файлове не знае предварително, което поставя вкл-файлът ще бъде заместен. В резултат на това - няма работа CodeInsight. не може да има проблеми с рефакториране и автоматично форматиране на код.
И такъв нюанс. Debugger с включени файлове работи по същия начин, както при конвенционалните па-файл. Но (както при генеричните лекарства) поставяне на прекъсване в вкл-файл, това е точка от и за Т1 и Т2. Решен чрез определяне на условията за точка на пречупване, например: Self е T1.
Свързани статии