返回首页

问题
是一个非常有趣的讨论有关在托管世界重载方法。由于讨论说,超载是一个品味的问题。它似乎在托管世界超载的方法,的确是一个口味问题。伤心,但真实的!但与此相反,它必须已[严格]规则。超载可能表现出不同的语言中的每个非托管世界。但据作为。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}

回答

评论会员:本罗宾斯 时间:2012/01/26
注意到一个不正确的前提下,试图在混乱的方式来解释它。将无关
评论会员:。tonyt 时间:2012/01/26
垃圾文章,是没有意义的。低劣的设计理念
评论会员:VivekRagunathan 时间:2012/01/26
"But in the case of C#, the first principle observed in overloading is to avoid it."

耻辱你一个不好的设计的例子,并使用它作为一个超载的毯子起诉书理由。

它通常是糟糕的设计,以实现多个重载,接受一个基本类型,以及一个或多个其他接受从基类型派生的类型。这仅仅是一个非常糟糕的主意,在其本身。

如果一个程序员发现themself这样做,它通常意味着,该基地和重载接受派生类型是fundamentially有缺陷的的,可能是因为使用这些类型的虚拟/重写的方法几乎肯定会做出任何需要多个重载接受基地和派生类型是不必要的。

或者把你的榜样,如果"父"实现"儿童"或任何其他派生类型覆盖重写的虚方法,这些方法都解决了在运行时动态,并通过一个家长参考,并因此,没有两个重载接受家长的需要和一个孩子。

哦,顺便说一句,在您的文章开始的链接被打破修改日(星期一),8月2日,2010下午04:04
评论会员:tonyt 时间:2012/01/26


所有是正确的,如果类被写入重新。一个会遇到这样的家长\孩子重载后已经写好的代码时解释。和后并不打算在C#中的批判超载设计。

评论表示感谢。

关于
Vivek Ragunathan
{A}
编程是一门艺术。代码是一首诗:
|