【问题标题】:Some questions about abstract class with private, public and protected constructors关于具有私有、公共和受保护构造函数的抽象类的一些问题
【发布时间】:2011-03-28 03:01:01
【问题描述】:

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

我的第二个问题:如果抽象类有一个私有构造函数,这有意义吗?

提前致谢!

【问题讨论】:

    标签: c# oop


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:
        1. 很少。公共构造函数只能用作受保护的构造函数。

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

        【讨论】:

        • 在 2 中:您的意思是“this”关键字。 “base”在派生类中,不能调用私有ctor。
        • @John,如果派生类型是派生类型的嵌套类,“base”可以调用私有构造函数。
        • @Dan - 是的,从技术上讲这是可行的,但谁会这样做?
        • @John,这是我所知道的在不允许其他用户继承您的类的情况下进行继承的唯一方法(内部构造函数很接近,如果所需的耦合不太紧密,则可能更可取。) Eric Lippert 提到他有时也会使用这种模式:stackoverflow.com/questions/1083032/…
        【解决方案4】:

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

        Foo
        酒吧

        public abstract class Foo
        {
            protected Foo() {
                Console.WriteLine ("Foo");
            }
        }
        
        public class Bar : Foo
        {
            public Bar() {
                Console.WriteLine ("Bar");
            }
        }
        
        void Main()
        {
            new Bar();
        }
        

        如果受保护的抽象构造函数不能被覆盖。不确定我是否回答了你的问题:-)

        【讨论】:

        • 没有“抽象构造函数”这样的东西,你也不能重写构造函数。
        • 可能是这样,但是如果您尝试上面的代码,您会发现我在一个抽象类中有一个构造函数,它确实在创建派生自它的类时执行。
        【解决方案5】:

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

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

        【讨论】:

        • #2 - 或嵌套类型的构造函数,根据 Dan 的回答。
        猜你喜欢
        • 2011-05-30
        • 2013-08-29
        • 2019-08-24
        • 2014-12-23
        • 1970-01-01
        • 2010-11-08
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多