Closed. This question is opinion-based。它当前不接受答案。
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
3年前关闭。
为什么基类没有隐式链构造函数?
我的意思是?让我们看一下以下类:
如果尝试编译此代码,则不会编译。如您所见,
为什么没有隐式的
只是为了争辩:我开始问自己这个问题,以创建具有可注入依赖项的控制器,因为所有这些依赖项都存在于我的所有控制器中(并且我想弄清楚它们是必需的),我创建了一个基类,然后我发现了重新创建所有构造函数非常烦人...
P.s.我确实知道,还有其他一些编程模式,例如具有公共无参数构造函数和依赖项的公共属性,但这是另一回事了。
我不是在寻找重新实现此方法的方法,我只是在试图理解为什么不可能或为什么没有做到这一点。
上面的代码有3个错误,并提供3个明显的解决方案:
编译器可以轻松推断
编译器可能“对此很聪明”,并且知道丢失的括号位于
在编译时“自动更正”显然很简单。
那为什么编译器不这样做呢?为什么这实际上不会以任何语言发生?
好吧,原因很简单,就是没有理由就很危险。是的,所有这些似乎都是解决小错误或细节的逻辑解决方案,但实际上让编译器解决这些类型的问题会导致很多无法解释的行为(如果开发人员确实希望在第一次迭代后返回,该怎么办? )。另一方面,不解决这些问题并提醒他们的成本相当便宜。它可以使开发人员确切地知道出了什么问题,并且如果解决方案确实如此简单,则只需花费很少的时间即可进行手动更正。
这里的权衡是很容易选择的,它为开发人员提供了足够的信息,以便可以快速解决问题,并且没有任何机会!
问题中建议的“隐式继承的构造函数”也是如此……是的,编译器可以轻松地做到这一点……但是,如果开发人员确实打算在构造函数中做一些实际工作,却忘记了呢?编译器不应该通过错误退出来提供帮助?
想改善这个问题吗?更新问题,以便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
未定义编译器可以轻松推断
i
为int
类型,并且在for
语句中是本地的。for
块缺少右花括号编译器可能“对此很聪明”,并且知道丢失的括号位于
return ...
语句之前,仅仅是因为将return
作为for
块的一部分而没有任何分支是没有意义的。return total
缺少分号在编译时“自动更正”显然很简单。
那为什么编译器不这样做呢?为什么这实际上不会以任何语言发生?
好吧,原因很简单,就是没有理由就很危险。是的,所有这些似乎都是解决小错误或细节的逻辑解决方案,但实际上让编译器解决这些类型的问题会导致很多无法解释的行为(如果开发人员确实希望在第一次迭代后返回,该怎么办? )。另一方面,不解决这些问题并提醒他们的成本相当便宜。它可以使开发人员确切地知道出了什么问题,并且如果解决方案确实如此简单,则只需花费很少的时间即可进行手动更正。
这里的权衡是很容易选择的,它为开发人员提供了足够的信息,以便可以快速解决问题,并且没有任何机会!
问题中建议的“隐式继承的构造函数”也是如此……是的,编译器可以轻松地做到这一点……但是,如果开发人员确实打算在构造函数中做一些实际工作,却忘记了呢?编译器不应该通过错误退出来提供帮助?
关于c# - .NET中的隐式链构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34537222/