Ако родителският клас и всички предшественици имплементират своя Clone
метод, като извикват Clone
метода на своя родителски клас, чак до Object.clone
, и ако нито едно от полетата, добавени от подкласа, не съдържа препратки към неща, които трябва да могат да се променят на един обект без да засяга другия, тогава човек може просто да наследи клонинг, без да го отменя. Ако родителският клас прилага метода за клониране, както е описано по-горе, но подкласът добавя полета, които сами трябва да бъдат клонирани, най-добрият модел е подкласът да извика base.Clone
и след това да клонира съответните полета.
Ако родителският клас или който и да е предшественик не имплементира своя Clone
метод, както е описано по-горе, а вместо това използва конструктор за копиране, тогава производният клас и всички базови класове, извлечени от него) трябва да заменят Clone
, за да направят същото, независимо дали базовият клас добавя всякакви нови полета.
За съжаление, не знам за хубав начин да установя към коя категория принадлежи даден родителски клас. Ако родителски клас поддържа Clone
чрез извикване на base.Clone
, би било жалко за производен клас ненужно да прекъсва веригата чрез внедряване на конструктор за копиране. От друга страна, ако родителският клас имплементира Clone
като конструктор за копиране, базов клас, който не го прави, ще има нарушена семантика.
person
supercat
schedule
18.12.2011