2016-05-17 115 views
0

我有以下類別設置是這樣的:繼承和功能具有不同的返回類型

class Test 
{ 
    public virtual subSmallObject CreateSmallObject 
    { 
     return new subSmallObject(); 
    } 
} 

abstract class subSmallObject 
{ string test; } 
class subSmallObjectA : subSmallObject 
{ string testA; } 
class subSmallObjectB : subSmallObject 
{ string testB; }  

現在,而不是使用測試類無處不在,我需要使用一個派生類測試中,我們姑且稱之爲類TestA和TestB。測試A和B需要讓CreateSmallObject類返回subSmallObjectA或SubSmallObjectB。

所以通常我只是做

class TestA : Test 
{ 
    override subSmallObject CreateSmallObject() 
    { 
     return new subSmallObjectA(); 
    } 
} 
class TestB : Test 
{ 
    override subSmallObject CreateSmallObject() 
    { 
     return new subSmallObjectB(); 
    } 
} 

但問題是,我不能再投從那些subSmallObjectA或subSmallObjectB的subSmallObject回報,由於TOT手頭的任務,他要求(這將打破了許多我無法控制的東西,那些東西需要smallSubObjectA或subSmallObjectB)。 subSmallObjectA和subSmallObjectB之間會有共享元素。我不想消除虛函數,因爲如果有兩個單獨的方法,則會重複一些代碼。

有沒有我失蹤的模式或任何實踐?我在這方面有點失落,這種架構變化超出了我的想法,因爲我不知道「正確」的方式來做到這一點。

回答

0

不能投出方法調用的結果是......很奇怪。 如果你絕對不能,你可以嘗試一個通用的工廠方法:

class SubObject{ 
    public string Data; 
} 
class SubObjectA{ 
} 
class SubObjectB{ 
} 
class Test{ 
    T GetSubObject<T>() where T:SubObject,new() 
    { 
     return new T(); 
    } 
} 

一樣使用

SubObjectA so=testInstance.GetSubObject<SubObjectA>(); 

這樣,你不必有在調用網站上的投放。如果SubObject沒有默認的構造函數,它不會工作。

相關問題