2011-12-19 117 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; 
    } 
}