2016-05-17 2 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; }  

Теперь, вместо того чтобы использовать класс Test везде, мне нужно использовать производный класс Test, давайте называть их класс 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(); 
    } 
} 

Но проблема в том, что я не могу затем бросить subSmallObject отдачу от тех subSmallObjectA или subSmallObjectB, из-за карапуз он требованиям задачи под рукой (это было ломать много вещей, которые я не контролирую. Эти вещи ожидают либо 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 не имеет конструктора по умолчанию.