2011-12-19 77 views
0

語言是C#。
說我有重寫類方法的C#。我可以自動替換派生類而不是基類

class A:B 
    { 
     protected override void Method(BaseClass bc) 
     { 
      (DerivedClass)bc.DerivedClassField = blabla; 
     } 
    } 

是否有任何庫/語言功能的/ etc使用,我可以寫如下:由

class A:B 
    { 
     protected override void Method(BaseClass bc) 
     { 
      bc.DerivedClassField = blabla; 
     } 
    } 

,比如增加一些屬性類A還是什麼?
對不起,格式糟糕。

+2

爲什麼演員表不可接受?你有沒有考慮過審查你的設計?這將從根本上打破OOP的原則。 – Strillo 2011-12-19 13:13:42

+0

B類應該是可重用的,所以我們有許多方法可以在許多類中重寫。另一方面,我們一定知道bc實際上是哪個類(好吧,我知道這個說法並不能讓我看起來像個能幹的程序員:))。我正在考慮審查設計,但仍然渴望儘可能少地編寫代碼)此外,這將使得重新使用B更容易。 – noaRAVE 2011-12-19 13:27:51

+0

這是這個問題的重複:http://stackoverflow.com/questions/8509747/virtual-lists-in-c-sharp-to-avoid-typecasting-in-inherited-classes/8510522#8510522看到它的一些如何處理這個問題的想法。 – 2011-12-19 15:49:39

回答

1

你可以使用泛型來做到這一點的類型安全方式:

class A<T> where T : BaseClass { 
    protected virtual void Method(T bc) { ... } 
} 

class B : A<DerivedClass> { 
    protected override void Method(DerivedClass bc) { 
     bc.DerivedClassField = blabla; 
    } 
} 

但是這可能會導致其他問題,如果你連想使用A<T>不知道T,在這種情況下我也使用強制轉換(如果類結構意味着強制轉換不會失敗)或重新定義對象模型。

+0

嗯,沒想到使用模板,有趣...實際上這可能工作,謝謝:) – noaRAVE 2011-12-19 13:31:42

+0

他們不是模板,他們是泛型。儘管語法相同,但C#泛型與C++模板完全不同。 – thecoop 2011-12-19 13:43:26

+0

是的,我知道,只是調用它們的壞習慣。 – noaRAVE 2011-12-19 16:58:37

0

如果您確定這是事實,您可以將bc作爲DerivedClass進行投票。

class A:B 
{ 
    protected override void Method(BaseClass bc) 
    { 
     ((DerivedClass)bc).DerivedClassField = blabla; 
    } 
}