【发布时间】:2011-03-28 03:01:01
【问题描述】:
我的第一个问题:抽象类中受保护的构造函数和公共构造函数有什么区别?
我的第二个问题:如果抽象类有一个私有构造函数,这有意义吗?
提前致谢!
【问题讨论】:
我的第一个问题:抽象类中受保护的构造函数和公共构造函数有什么区别?
我的第二个问题:如果抽象类有一个私有构造函数,这有意义吗?
提前致谢!
【问题讨论】:
为了澄清我的第一个问题,我将再次回答(不发表评论)。所以,我知道直接实例化抽象类是不可能的。只有当一个类派生自抽象类时,才能被实例化。我知道一个类可以有像私有、公共、内部和受保护的构造函数。保护是什么意思,我知道。
但是抽象类中的公共构造函数和受保护构造函数之间有什么区别。我看不出两者之间的区别。
【讨论】:
在抽象类上使用私有构造函数的一种可能设计:
public abstract class BaseClass
{
private BaseClass(Object param)
{
//Do something with parameters
}
//Provide various methods that descendant classes will know how to perform
public static BaseClass FromObject(Object value)
{
//Based on object, choose which type of derived class to construct...
}
private class HiddenDerivedA : BaseClass
{
public HiddenDerivedA(Object value)
: base(value)
{
}
}
private class HiddenDerivedB : BaseClass
{
public HiddenDerivedB(Object value)
: base(value)
{
}
}
}
如果派生实现与用于构造它们的选择逻辑紧密耦合,并且您希望提供与其余代码的高度隔离,则此模式很有用。它免除了您必须支持除您明确打算的继承者之外的其他继承者的责任,并允许您将所有私有状态从基类公开给派生类。
【讨论】:
很少。公共构造函数只能用作受保护的构造函数。
是的,它可以使用 this 关键字从其他(受保护/公共)构造函数中调用('sideways')。
【讨论】:
对我来说似乎没有太大区别,以下代码输出
Foo
酒吧
public abstract class Foo
{
protected Foo() {
Console.WriteLine ("Foo");
}
}
public class Bar : Foo
{
public Bar() {
Console.WriteLine ("Bar");
}
}
void Main()
{
new Bar();
}
如果受保护的抽象构造函数不能被覆盖。不确定我是否回答了你的问题:-)
【讨论】:
问题 #1: 不多。无论如何,您不能直接调用抽象类的构造函数(实例化它)。您只能从子类中调用一个,这意味着您肯定可以访问受保护的成员以及公共成员。
问题 #2: 不,没有多大意义。抽象类上的私有构造函数只能通过“构造函数链接”从同一类中的非私有构造函数中调用。
【讨论】: