2016-06-29 5 views
1

두 클래스를 작성하려고하는데 '부모와 자식'이라고 부릅니다.제네릭 형식을 반환하는 상속 함수

부모는 다른 키로 유형과 함께 KeyValuePair을 반환하는이 함수를 재정의 할 수있는 아이 인 의도를 가진 (일종의) 제네릭 형식

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

을 반환하는 함수를 정의하는 추상 클래스입니다 값.

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'를 호출 할 수 없습니다. 그럼 기본 클래스에 넣는 이유는 무엇입니까? – Blorgbeard

답변

2

매개 변수가 다른 클래스는 완전히 다른 것들입니다.

KeyValuePair<string, int> 

KeyValuePair<string, Graphics> 

예를 들어 위의 두 KeyValuePairs는 서로 바꿔 쓸 수 없습니다.

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

고마워요.하지만 여전히 두 번 이상 타입 자체를 정의해야하며, 지금 인터페이스를 만드는 것도 필요합니다. 그 후 원래 디자인이 핵심에 결함이 있다는 것을 깨달았습니다. 그런 인터페이스가 필요한 것은 증상이었습니다. –

관련 문제