2016-05-17 69 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没有默认的构造函数,它不会工作。

相关问题