[英]Factory pattern for child classes with changing parameter/ return types in virtual functions
[英]Types of child classes
我有一個問題,哪種類型適用於所有具有靜態類型和某種OOP的語言。
如果我有一個類A,一個是A的子代的類B,一個是B的子代和類型A的變量的類C,是否也可以在其中存儲B和C的實例?
在Delphi中,答案是肯定的。
例如,我創建了一個語法高亮的文本編輯器組件。 該組件具有屬性FormattingProcessor
,其類型為TFormattingProcessor
。 現在,我創建了幾個格式化處理器,例如TXMLFormattingProcessor
, TPascalFormattingProcessor
和TINIFormattingProcessor
,每個類都是TFormattingProcessor
的子TFormattingProcessor
。 這些中的任何一個都可以分配給文本編輯器組件的FormattingProcessor
屬性。
也就是說, TFormattingProcessor
可以將聲明為TFormattingProcessor
的變量賦值為TXMLFormattingProcessor
, TPascalFormattingProcessor
或TINIFormattingProcessor
類型的值。
如果您在VCL中四處查看,您會發現這種分配實際上非常普遍。 例如, TLabel
組件具有FocusControl
屬性,該屬性的類型為TWinControl
(如果我沒FocusControl
話)。 您可以將TWinControl
任何后代分配給該屬性,例如TEdit
。 (FocusControl是在與Alt鍵一起鍵入標簽的加速鍵時將獲得鍵盤焦點的控件。)
在C ++中,答案是否定的。 如果類型是A*
或A&
,答案將是,但是對於A
則不是。
在Java,C#和其他語言中,變量默認情況下是對對象的引用,答案是肯定的。
當您說類“ B”是“ A”的子代以及在何處進行訪問時,如果不知道是什么類型的繼承,就無法可靠地回答此問題。 換句話說,在不知道基地是否可訪問和明確的情況下,不可能正確回答這個問題。
$ 11.2 / 4-“如果可以訪問基類的發明的公共成員,則可以訪問基類。”
假設“ A”是“ B”的明確且可訪問的基數,並且“ B”是“ C”的明確且可訪問的基數,並且“ A”,“ B”和“ C”是具體的類(沒有純虛功能)
B b;
C c;
A &rb = b; // OK
A &rc = c; // OK
A *pb = &b; // OK
A *pc = &c; // OK
A a1 = b; // sliced, only 'A' subobject of 'B' is copied onto 'a1', may be a logical error
A a2 = c; // sliced, only 'A' subobject of 'C' is copied onto 'a2', may be a logical error
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.