2013-12-11 200 views
1

我試圖做這樣的事情:覆蓋抽象方法的返回類型與具體類型

public abstract class A 
{ 
    public abstract AbstractSomething foobar {get;} 
} 

public class B : A 
{ 
    public override ConcreteSomething foobar 
    { 
     get 
     { 
      return new ConcreteSomething(); 
     } 
    } 
} 

編譯器警告我說,壓倒一切的類型必須與基本類型相匹配。我關於返回AbstractSomething的一點是我要求用戶正確地轉換返回的值。

什麼是最好的方法來實現我的getter?不使用泛型可以做到這一點嗎?

+1

有什麼理由不在這裏使用接口? –

+1

如果您使用的是抽象方法,那麼第一點是您應該在派生類中定義抽象方法。 –

+0

你爲什麼不使用泛型? –

回答

3

您確實需要使用泛型,但它不是一個壞的解決方案:

public abstract class A<T> where T:AbstractSomething 
{ 
    public abstract T foobar { get; } 
} 

public abstract class AbstractSomething 
{ 
} 

public class ConcreteSomething : AbstractSomething 
{ 

} 

public class B : A<ConcreteSomething> 
{ 
    public override ConcreteSomething foobar 
    { 
     get 
     { 
      return new ConcreteSomething(); 
     } 
    } 
} 
3

不使用泛型就可以做到這一點嗎?

沒有。使用泛型:

public abstract class A<T> 
    where T : AbstractSomething 
{ 
    public abstract T foobar { get; } 
} 

public class B : A<ConcreteSomething> 
{ 
    public override ConcreteSomething foobar 
    { 
     get 
     { 
      return new ConcreteSomething(); 
     } 
    } 
} 
2

您可以使用泛型指定它,雖然這確實讓一些事情很難一起工作:

public abstract class A<T> where T : AbstractSomething 
{ 
    public abstract T foobar {get;} 
} 

public class B : A<ConcreteSomething> 
{ 
    public override ConcreteSomething foobar 
    { 
     get 
     { 
      return new ConcreteSomething(); 
     } 
    } 
}