使用特定的重载而不进行强制转换?

时间:2011-09-19 12:46:02

标签: c# .net .net-4.0

我想创建一些可识别继承的辅助方法。我希望它们像虚拟+覆盖方法一样工作,但不必定义类层次结构。

以下是演员的表现方式。我希望能够在没有多次演员的表演的情况下做到这一点......并且没有定义另一个层次结构:

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);
    }
}

任何想法。提前谢谢。

4 个答案:

答案 0 :(得分:2)

如果B继承自A,则来电者可以直接向B提供public void DoSomething(A o){} DoSomething(new B()); 的实例:

{{1}}

所以不需要其他方法。为了消除歧义,可能需要强制转换,否则编译器无法确定您希望调用哪种方法 - 因为两者对提供的参数都有效。

如果你能证明铸件造成问题,那么铸件和性能应该只是一个问题。试图抢先这样的事情可能最终会导致过早的优化。

也就是说,我目睹了包含深层次结构(大量重写方法)的事物代码路径缓慢。

答案 1 :(得分:2)

BA的演员表没有性能损失 - 它保证是正确的,所以没有实际的检查要执行。它只是委托方法调用。

话虽如此,我实际上建议不要使用像这样的类型层次结构的重载。 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)