【问题标题】:Easiest way to make C# not instantiate a class unless inherit?除非继承,否则使 C# 不实例化类的最简单方法?
【发布时间】:2011-01-05 05:28:17
【问题描述】:

让 C# 不实例化一个类,除非继承的最简单方法是什么?

听起来很奇怪,但我不想解释原因。我有一个基类和两个继承它的类。我只想使用派生类而不是基类。派生类没有任何额外的功能。什么是不允许我编写 new BaseClass(); 的最简单方法?所以我不会不小心使用它?我确实有在基类而不是派生类上运行的函数。

【问题讨论】:

  • 我喜欢一个人描述一个现有特征的问题(在这种情况下是抽象类)。他们的问题如此整洁,答案如此清晰,让我非常满意。
  • 原来也有人对我投了反对票。很奇怪。
  • @acidzombie24,我猜是因为当您忽略了超过 20 个赞成票的答案时,您接受了一个不受欢迎的答案。
  • 有什么大不了的?我+1 20 票,两个答案都是一样的。使用 abstract 关键字。

标签: c# class inheritance


【解决方案1】:

为基类使用受保护的构造函数

【讨论】:

    【解决方案2】:

    使该类成为abstract 基类。

    abstract class Person { }
    
    class Programmer : Person { }
    
    var person = new Person();          // compile time error
    var programmer = new Programmer();  // ok
    

    【讨论】:

    • 当你尝试实例化它时,你甚至看不到智能感知列表中的类名,这对意识来说太棒了:)
    【解决方案3】:

    您描述您的需求的方式,让您的班级abstract 是要走的路。它会 阻止您实例化基类,并允许您调用函数 它。这也将允许您将函数和属性标记为抽象和 强制继承的类实现它们。

    如果您不需要共享代码,界面将是一个不错的选择。它允许您 以非常类似于抽象类的方式实现它并转换你的 实现。

    希望这能增加一些价值。

    【讨论】:

      【解决方案4】:

      使BaseClass的构造函数受保护:

      public class BaseClass {
      
         protected BaseClass()
         {
            // DO SOMETHING
         }
      
      }
      
      
      public class Derived : BaseClass {
      
         public Derived() {}
      }
      

      【讨论】:

      • 只有当他因为一些奇怪的原因不能使基类抽象时。
      • 上面有更好的解决方案。
      【解决方案5】:

      而不是正常的:

      "public Class MyClass"

      做起来

      "public abstract Class MyClass"
      

      【讨论】:

        【解决方案6】:
        public abstract class BaseClass {
        ...
        }
        

        【讨论】:

          【解决方案7】:

          将类设置为抽象:

          public abstract BaseClass
          {
          
          
          
          }
          

          http://msdn.microsoft.com/en-us/library/sf985hc5.aspx

          【讨论】:

            【解决方案8】:

            基类可以是抽象的吗?这样就可以了。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-09-18
              • 1970-01-01
              • 1970-01-01
              • 2010-09-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多