2016-06-29 4 views
1

Я пытаюсь написать два класса, назовите их родителями и дочерними.Наследование функций, возвращающих общие типы

родитель является абстрактным классом, который определяет функцию, которая возвращает (вид) общего типа

public abstract class Parent 
{ 
    public abstract KeyValuePair<K,V> foo(someInputs); 
} 

с целью в том, что ребенок может отменить эту функцию для возврата KeyValuePair с различными типами как ключ и стоимость.

public abstract class Child 
{ 
    public override KeyValuePair<string,int> foo(someInputs) 
    { 
      return(new KeyValuePair<string,int>(someInput1,someInput2); 
    } 
} 

Это достигает цели общения с пользователем развития ребенка (будущее мне), что функция должна возвращать KeyValuePair, но я свободно использовать любой KeyValuePair я хочу.

К сожалению, хотя это, кажется, единственный способ достижения этой цели является также сделать класс общим,

public abstract class Parent<K,V> 

и передать K и V вплоть до абстрактной функции.

Это означает, что когда я пишу его, мне нужно определить те же типы для класса (который теперь является общим) и возвращать функцию. Если они не совпадают, компилятор сам по себе (без уважительной причины).

Есть ли способ получить эти «полу-общие» типы возврата без создания класса?

+1

Непонятно, почему создание «родительского» родового является проблемой для вас. Почему вы пытаетесь избежать этого? –

+0

Какой смысл делать это? В любом случае вы не можете иметь ключ KeyValuePair 'вне универсального метода/класса. Таким образом, вы никогда не можете называть 'foo' ссылкой« Parent ». Так зачем вообще помещать его в базовый класс? – Blorgbeard

ответ

2

Занятия с разными родовыми параметрами - это совершенно разные вещи.

KeyValuePair<string, int> 

KeyValuePair<string, Graphics> 

Например, вышеупомянутые два KeyValuePairs не являются взаимозаменяемыми.

Пусть говорят, у вас есть 2 дочерних классов:

public abstract class Child1 : Parent 
{ 
    public override KeyValuePair<string, int> foo() { ... } 
} 

public abstract class Child2 : Parent 
{ 
    public override KeyValuePair<string, Graphics> foo() { ... } 
} 

Родитель класс не имеет никакого способа, чтобы удовлетворить обоих детей в одной декларации.

свободно использовать любой KeyValuePair я хочу

Поэтому такая свобода не является логически правильным.

+0

Это имеет большой смысл. Я понял, что я написал все это неправильно, и это требование было симптомом этого плохого дизайнерского решения. –

0

У вас могут быть дети, реализующие общий интерфейс и не общий базовый класс (если необходимо)?

public abstract Parent 
{ 
    // common non-generic methods 
} 

public interface IFooable<T> 
{ 
    KeyValuePair<string, T> Foo(); 
} 

public class Child1 : Parent, IFooable<int> 
{ 
    public virtual KeyValuePair<string, int> Foo() 
    { 
    } 
} 

public class Child2 : Parent, IFooable<string>, IFooable<bool> 
{ 
    public KeyValuePair<string, string> Foo() 
    { 
    } 

    public KeyValuePair<string, bool> Foo() 
    { 
    } 
} 
+0

Спасибо, но это по-прежнему требует определения самого типа дважды, а также включает в себя создание интерфейса сейчас. С тех пор я понял, что первоначальный дизайн был неисправен по своему ядру, и мой необходимость в таком интерфейсе был симптомом. –

Смежные вопросы