Closed. This question is opinion-based。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
                        
                        3年前关闭。
                                                                                            
                
        
为什么基类没有隐式链构造函数?

我的意思是?让我们看一下以下类:

class Person
{
    public String Name { get; set; }
    public Person(string name)
    {
        Name = name;
    }
}

class EnhancedPerson : Person
{
    public int Age { get; set; }
}


如果尝试编译此代码,则不会编译。如您所见,Person取决于名称,并且很清楚,没有Person的情况下不会构造Name

为什么没有隐式的EnhancedPerson构造函数,谁为每个Person构造函数链接到基本的构造函数?

只是为了争辩:我开始问自己这个问题,以创建具有可注入依赖项的控制器,因为所有这些依赖项都存在于我的所有控制器中(并且我想弄清楚它们是必需的),我创建了一个基类,然后我发现了重新创建所有构造函数非常烦人...

P.s.我确实知道,还有其他一些编程模式,例如具有公共无参数构造函数和依赖项的公共属性,但这是另一回事了。

我不是在寻找重新实现此方法的方法,我只是在试图理解为什么不可能或为什么没有做到这一点。

最佳答案

“真正的”原因只能由定义语言的人来回答,但我可以推测...

可以自动解决各种编译时错误,例如:

int mul(int c, int n) {
  int total = 0;
  for(i = 0; i < n; i++) {
    total += c;
  return total
}


上面的代码有3个错误,并提供3个明显的解决方案:


i未定义
编译器可以轻松推断iint类型,并且在for语句中是本地的。
for块缺少右花括号
编译器可能“对此很聪明”,并且知道丢失的括号位于return ...语句之前,仅仅是因为将return作为for块的一部分而没有任何分支是没有意义的。
return total缺少分号
在编译时“自动更正”显然很简单。


那为什么编译器不这样做呢?为什么这实际上不会以任何语言发生?
好吧,原因很简单,就是没有理由就很危险。是的,所有这些似乎都是解决小错误或细节的逻辑解决方案,但实际上让编译器解决这些类型的问题会导致很多无法解释的行为(如果开发人员确实希望在第一次迭代后返回,该怎么办? )。另一方面,不解决这些问题并提醒他们的成本相当便宜。它可以使开发人员确切地知道出了什么问题,并且如果解决方案确实如此简单,则只需花费很少的时间即可进行手动更正。

这里的权衡是很容易选择的,它为开发人员提供了足够的信息,以便可以快速解决问题,并且没有任何机会!

问题中建议的“隐式继承的构造函数”也是如此……是的,编译器可以轻松地做到这一点……但是,如果开发人员确实打算在构造函数中做一些实际工作,却忘记了呢?编译器不应该通过错误退出来提供帮助?

关于c# - .NET中的隐式链构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34537222/

10-10 09:18
查看更多