代码之家  ›  专栏  ›  技术社区  ›  Esteban Araya

为什么构造函数没有被继承?

  •  34
  • Esteban Araya  · 技术社区  · 16 年前

    我猜关于C#继承有一些非常基本的东西我不理解。有人能告诉我吗?

    5 回复  |  直到 4 年前
        1
  •  34
  •   recursive    16 年前

    有时,在子类化时,您希望限制创建类实例所需的条件。

    让我给你举个例子。如果类确实继承了它们的超类构造函数,那么所有类都将具有来自的无参数构造函数 Object

        2
  •  29
  •   Glorfindel RameshVel    4 年前

    如果你想一想如果构造函数 继承之后,您应该开始看到问题所在。

    nearly every type in .NET inherits from Object (它有一个无参数构造函数),这意味着您创建的几乎每种类型都将被迫有一个无参数构造函数。但是有 无参数构造函数没有意义的类型。

    版本控制也会有问题。如果基类型的新版本出现时带有新构造函数,则会自动在派生类型中获得新构造函数。这将是一件坏事,而且是 fragile base class 问题

    还有一个更哲学的论点。继承是关于类型责任的(我就是这么做的)。构造函数是关于类型协作的(这就是我需要的)。因此,继承构造函数将混合类型责任和类型协作,而这两个概念实际上应该保持分离。

        3
  •  12
  •   cletus    16 年前

        4
  •  2
  •   Loki Astari    16 年前

    我想你的意思是:

    class Foo
    {
       public Foo(int someVar) {}
    }
    
    class Bar : Foo
    {
        // Why does Bar not automatically have compiler generated version of 
        Bar(int someVar): Foo(someVar) {}
    }
    

    我相信这是从C++(和java)继承的。
    但假设你们有这个,Bar还有一些其他的成员变量。这不会引入偶然使用的编译器生成的构造函数的可移植性,也不会初始化BAr的成员。

        5
  •  0
  •   toad    16 年前

    class Bar : Foo { }
    

    当Bar被实例化时,默认情况下它将调用Foo()构造函数。

    class Foo {
        public Foo(int someVar) {}
    }
    
    class Bar : Foo {
        public Bar() : base(42) {}
    }
    

    如果没有无参数构造函数,则需要定义要使用的构造函数并传递参数。