关于私有,公共和受保护构造函数的抽象类的一些问题

时间:2010-08-10 23:32:55

标签: c# oop

我的第一个问题:抽象类中的受保护构造函数和公共构造函数之间有什么区别?

我的第二个问题:如果抽象类有私有构造函数,它是否有意义?

提前致谢!

5 个答案:

答案 0 :(得分:7)

一种可能在抽象类上使用私有构造函数的设计:

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)
        {
        }
    }
}

如果派生的实现与用于构造它们的选择逻辑紧密耦合,并且您希望提供与其余代码的高度绝缘,则此模式非常有用。它使您免除了除了您明确指定的那些之外必须支持其他继承者的责任,并允许您将所有私有状态从基类公开到派生类。

答案 1 :(得分:3)

  1. 很少。公共构造函数只能用作受保护的构造函数。

  2. 是的,可以使用其他(受保护/公共)构造函数中的this关键字调用它('sideways')。

答案 2 :(得分:3)

问题#1:不多。无论如何,您无法直接调用抽象类的构造函数(实例化它)。你只能从子类中调用一个,这意味着你当然可以访问受保护的成员以及公共成员。

问题#2:不,没有多大意义。抽象类上的私有构造函数只能通过同一类中的非私有构造函数的“构造函数链接”来调用。

答案 3 :(得分:0)

为了澄清我的第一个问题,我将再次回答(不予评论)。所以,我知道直接实现抽象类是不可能的。只有当一个类派生自abstarct类时,才能实现。我知道一个类可以有私有,公共,内部和受保护的构造函数。我知道,保护意味着什么。

但是抽象类中公共受保护构造函数之间的区别是什么。我看不出两者之间的区别。

答案 4 :(得分:-1)

对我来说似乎没有多大区别,以下代码输出


public abstract class Foo
{
    protected Foo() {
        Console.WriteLine ("Foo");
    }
}

public class Bar : Foo
{
    public Bar() {
        Console.WriteLine ("Bar");
    }
}

void Main()
{
    new Bar();
}

如果抽象构造函数受到保护,则无法覆盖它。不确定如果我回答你的问题: - )