今天寫一個簡單工廠的時候
突然向認真思考一下一個比較細節的用法。
先我稍微介紹下簡單工廠
一般由三部分構成,分別為:
(1)工厂类角色(Creator):
担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑.工厂类在客户端的直接调用下创建产品对象,它往往由一个具体类实现
(2)抽象产品角色(Product):
担任这个角色的类是由工程方法模式所创建的对象的父类,或它们共同拥有的接口.抽象产品角色可以用一个接口或抽象类实现.
(3)具体产品角色(Concrete Product)角色:
工程方法模式所创建的任何对象都是这个角色的实例,具体产品角色是由一个具体类实现.
在我的案例中
有工廠類nameFac(string str),並且具有public 函數getName1 返回類型為Name
抽象類 Name()
具體類 FName:Name
具體類 SName:Name
其中nameFac通過輸入的str返回不同的具體類 FName或SName
調用時代碼為
Name t2 = NameFac.getName1("xxxyyy");
Console.WriteLine(t2.getFRname().ToString());
我們且不討論具體的實現
代碼
Name t2 = NameFac.getName1("xxxyyy");
其左邊t2為Name 類型,getName1()返回類型為Name
但是getName1
存在代碼
reture new FName();
reture new SName();
也就是說,,,實際上getNam返回的地是FName或SName
而並不是其定義時候的Name
以前使用的時候我並沒有認真考慮今天就深入思考了下
后來想起之前,
關於值類型,與引用類型知識
參考(http://www.cnblogs.com/anytao/archive/2007/05/28/must_net_09.html)
關於子類,父類創建相關知識
參考(http://www.cnblogs.com/anytao/archive/2007/09/10/888985.html)
后終于明白怎麽囘事了
所謂new類子類即分是做了幾個動作
1、在堆棧中申請一個空間,其大小根據自己包含的所有類型的大小總合(父類大小+子類大小)
2、運行父類初始化方法
3、運行子類初始化方法
即是說,我們可以假設申請了一個内存空間,
為a0001-a0100其中
父類佔a0001-a0020
子類佔a0021-a00100
這樣我們的研究目標中
Name t2 = NameFac.getName1("xxxyyy");
”NameFac.getName1("xxxyyy");“部分已經明白了,
剩下的就是“Name t2 =”這個部分
首先我們應該思考最基礎的東西,這是一個什麽動作
對這個是一個對引用類型複值得動作
而我們都知道,,,把一個引用類型輔值給另外一個引用類型是怎麽一會事呢?
這下就很清楚了,,是把一個指針值複給另外一個引用類型
這樣剩下的就很簡單了
這個Name t2 = NameFac.getName1("xxxyyy");
說白了就是 t2=a0001
而 t2類型是Name所以只會讀取a0001-a0020
這這句話看起來就沒有任何問題了
其實只是個很基礎的問題,只是因爲我對基礎的知識不掌握的不夠深刻,無法貫通導致的無法理解其含義。
還是需要多多補充基礎知識阿