我想创建一些可识别继承的辅助方法。我希望它们像虚拟+覆盖方法一样工作,但不必定义类层次结构。
以下是演员的表现方式。我希望能够在没有多次演员的表演的情况下做到这一点......并且没有定义另一个层次结构:
class Program {
static void Main(string[] args){
var a = new A();
var b = new B();
var h = new Helper();
h.DoSomething(a);
h.DoSomething(b);
}
}
public class A{}
public class B : A{}
public class Helper{
public void DoSomething(A o){}
public void DoSomething(B o){
DoSomething((A)o);
}
}
任何想法。提前谢谢。
答案 0 :(得分:2)
如果B
继承自A
,则来电者可以直接向B
提供public void DoSomething(A o){}
DoSomething(new B());
的实例:
{{1}}
所以不需要其他方法。为了消除歧义,可能需要强制转换,否则编译器无法确定您希望调用哪种方法 - 因为两者对提供的参数都有效。
如果你能证明铸件造成问题,那么铸件和性能应该只是一个问题。试图抢先这样的事情可能最终会导致过早的优化。
也就是说,我目睹了包含深层次结构(大量重写方法)的事物代码路径缓慢。
答案 1 :(得分:2)
从B
到A
的演员表没有性能损失 - 它保证是正确的,所以没有实际的检查要执行。它只是委托方法调用。
话虽如此,我实际上建议不要使用像这样的类型层次结构的重载。 Overloading can get pretty complicated...
(和以前一样,如果没有测试,不要假设性能损失。创建一个干净的设计,并测试性能。当你发现时,只能开始弯曲形状一个问题。)
答案 2 :(得分:1)
你为什么演员?至于B : A
,您可以将B
传递给接受A
的方法:
public void DoSomething(A o) { }
DoSomething(new A());
DoSomething(new B());
答案 3 :(得分:0)
您可以将dynamic
类型(新.NET 4.0 Framework
类型 - dynamic)中的两个变量声明,或者简单地转换为动态变量。
看看dynamic
如何在运行时允许解析类型并选择适当的重载方法:
dynamic a = new A();
dynamic b = new B();
var h = new Helper();
h.DoSomething(a); // will be called DoSomething(A o)
h.DoSomething(b); // will be called DoSomething(B o)