c# - 构造函数和继承

标签 c# oop inheritance

让我们以 C# 为例

public class Foo
{
    public Foo() { }
    public Foo(int j) { }
}

public class Bar : Foo
{

}

现在,除了构造函数之外,Foo 的所有公共(public)成员都可以在 Bar 中访问。 我不能做类似的事情

Bar bb = new Bar(1);

为什么构造函数不可继承?

更新

我知道我们可以链接构造函数,但我想知道为什么上述构造无效。我相信应该有一个正当的理由。

最佳答案

构造函数不可继承,因为它可能会导致奇怪和意外的行为。更具体地说,如果您向基类添加了一个新的构造函数,则所有派生类都会获得该构造函数的一个实例。在某些情况下这是一件坏事,因为您的基类可能指定了对您的派生类没有意义的参数。

一个常见的例子是,在许多语言中,所有对象(通常称为“Object”)的基类都有一个没有参数的构造函数。如果构造函数是继承的,这将意味着所有对象都有一个无参数构造函数,并且没有办法说“我希望创建此类实例的人提供参数 X、Y 和 Z,否则他们的代码不应该编译。 “对于许多类来说,为它们的适当功能定义某些参数很重要,并且使构造函数不可继承是类作者可以保证始终定义某些参数的方式的一部分。

编辑以回应评论:Ramesh 指出,如果构造函数像他希望的那样被继承,他总是可以在每个派生类中使用私有(private)声明的构造函数来覆盖基类构造函数。这当然是正确的,但这种策略存在逻辑问题。它要求派生类的编写者必须密切关注基类,如果他们想要 block 继承基类构造函数,就必须添加一个私有(private)构造函数。对于编写派生类的人来说,这不仅是一项繁重的工作,而且这种跨类的隐式依赖正是那种会导致奇怪行为的事情。

Ramesh - 并不是说​​您所描述的内容不可能添加到语言中。一般来说,它没有完成,因为这种行为可能会使人感到困惑,并导致大量额外的调试和代码编写。

Quintin Robinson 在绝对值得一读的评论中对这个问题提供了一些非常有值(value)的回答。

关于c# - 构造函数和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/617336/

相关文章:

c# - 在 Entity Framework 和 WPF UI 中显示计算属性

java - 如何从数据库连接类调用方法

PHP OOP 与 MySQL

c++ - c++中的单虚拟继承编译器优化?

c++ - 应用于基类列表的覆盖函数

c# - 如何创建私有(private)的非全局记录器

java - 将序列化的 Java 对象转换为 C# 对象

c# - 在 EF4 Code-First 中按基本类型查询

c# - 如何将绑定(bind)重定向到 XAML 控件的 "outside"

java - 我应该公开组合对象吗?