问题
是一个非常有趣的讨论有关在托管世界重载方法。由于讨论说,超载是一个品味的问题。它似乎在托管世界超载的方法,的确是一个口味问题。伤心,但真实的!但与此相反,它必须已[严格]规则。超载可能表现出不同的语言中的每个非托管世界。但据作为。NET的推移,它必须有一个标准的规范。对不起,如果有一个。
由于这是在讨论中指出,如何界定的情况下,我们推导出另一个。NET语言开发的组件之间的类的行为?
远传统的C,重载方法的分辨率从派生,但没有严格的类型检查,例如:对于数值类型]。要注意的一点是,只有在与确切的原型为基础,派生类的方法被认为是超载。当然,C是类型安全的C#。这是在C#中override关键字的照顾,这使得只有确切的原型,在超载。而且有时是必需的,明确的铸造不像在C。
但在C#,在超载观察第一的原则,以避免它。相当混乱,对吧?以看看下面的例子:namespace Samples.MyConsole
{
class Parent
{
public void Foo()
{
Console.WriteLine("Parent.Foo");
}
}
class Child : Parent
{
public void Bar()
{
Console.WriteLine("Child.Bar");
}
}
class Base
{
public virtual void XYZ(Child c)
{
c.Foo();
c.Bar();
}
}
class Derived : Base
{
public virtual void XYZ(Parent p)
{
p.Foo();
}
public override void XYZ(Child c)
{
base.XYZ(c);
}
}
class User
{
public static void SomeMethod()
{
Child c = new Child();
Parent p = c as Parent;
Derived d = new Derived();
Base b = d as Base;
Console.WriteLine("Playing with Derived");
d.XYZ(c);
d.XYZ(p);
Console.WriteLine("\nPlaying with Base");
b.XYZ(c);
b.XYZ(p as Child);
}
}
}
下面是在控制台输出:{C}
,你也能猜到你体验的惊喜。是的,d.XYZ(C)调用Derived.XYZ(父P),而不是Derived.XYZ(三)儿童是一个更好的匹配。它如果它已作为新公共无效XYZ(儿童C)定义。但同样是没有用C的情况下。它没有给我们任何惊喜。
和尽可能的C / CLI而言,它的行为作为传统的C。
耐人寻味的苦的一部分,在托管世界的超载是不是一个东西在CLR级别也不似乎与规范有关的东西。这似乎是一个口味问题。{S0}