2013-02-14 51 views
0

是否有方法來覆蓋子類中的變量,但也可以將類型更改爲該類型的子類。 即。我可以覆蓋子類中的類變量,並將其類型更改爲子類

public class BaseClass 
{ 
    public BaseClass() { } 
    protected virtual MyBase WorkField { get { return new MyBase(); } } 
    public int WorkProperty 
    { 
     get { return WorkField.Value; } 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    public DerivedClass():base() { } 

    /* I get an error here saying that WorkField needs to be MyBase type*/ 
    protected override MyExtend WorkField 
    { 
     get 
     { 
      return new MyExtend(); 
     } 
    } 

    //public new int WorkProperty 
    //{ 
    // get { return 0; } 
    //} 
} 

public class MyBase 
{ 
    public int Value = 1; 
} 

public class MyExtend : MyBase 
{ 
    public int value = 20; 
} 

有沒有類似這樣的方法,但有效? 所以我可以有一個在MyBase上執行任務的superClass,然後有一個在MyEntend版本上執行任務的子類。 沒有鑄造它,每次我使用它。

回答

1

在這種情況下沒有理由更改簽名。只需返回派生類型:

public class DerivedClass : BaseClass 
{ 
    public DerivedClass():base() { } 

    protected override MyBase WorkField 
    { 
     get 
     { 
      return new MyExtend(); 
     } 
    } 

    //public new int WorkProperty 
    //{ 
    // get { return 0; } 
    //} 
} 

您的子類的多態行爲將允許您返回它。

0
public class BaseClass<T> where T: MyBase, new() 
    { 
     public BaseClass() { } 
     protected virtual T WorkField { get { return new T(); } } 
     public int WorkProperty { get { return WorkField.Value; } } 
    } 

    public class DerivedClass : BaseClass<MyExtend> 
    { 
     public DerivedClass() : base() { } 
     protected override MyExtend WorkField { get { return new MyExtend(); } } 

     //public new int WorkProperty 
     //{ 
     // get { return 0; } 
     //} 
    } 

    public class MyBase 
    { 
     public MyBase() 
     { 

     } 
     public int Value = 1; 
    } 
    public class MyExtend : MyBase 
    { 
     public int value = 20; 
    } 
1

重寫簽名應該是基本的基礎方法。

public class BaseClass<T> where T : MyBase, new() 
{ 
    public BaseClass() { } 
    protected virtual T WorkField { get { return new T(); } } 
    public int WorkProperty { get { return WorkField.Value; } } 
} 

public class DerivedClass : BaseClass<MyBase> 
{ 
    public DerivedClass() : base() { } 

//相同的錯誤發生是由於基屬性的類型是 「MyBase」

保護覆蓋MyExtend WorkField {{返回新MyExtend(); }}

//public new int WorkProperty 
    //{ 
    // get { return 0; } 
    //} 
}