【问题标题】:I want to use a base class but I dont want calling apps to know about it how do I do this? c#我想使用一个基类,但我不想调用应用程序知道它我该怎么做? C#
【发布时间】:2011-06-21 11:19:18
【问题描述】:

我有 C# 类库。与班级“学生”。它继承自“人”。

我希望类库的用户能够实例化班级学生而不是人。

我尝试了以下方法:

public class person

private class student : person

但是我得到了编译错误:

命名空间中定义的元素不能 被明确声明为私有, 受保护或内部保护。

这是为什么?我想公开人员,但不公开底层的基本类型。

【问题讨论】:

    标签: c#


    【解决方案1】:

    将您的 Person 类声明为 abstract。这意味着它不能被实例化。

    抽象类不能作为对象实例化,只能用于派生子类。

    public abstract class Person
    {
     // members here
    }
    
    public class Student : Person
    {
     // members here
    }
    

    更多信息请参见this MSDN article

    【讨论】:

    • 如果你需要实例化一个person类怎么办?您会推荐一个抽象的 BasePerson 类,然后推荐一个名为 Person 的继承类吗?那么是否所有其他类都继承 BasePerson?
    • @Joel 可能会这样做,是的 :)
    【解决方案2】:

    我会创建Personabstract

    编辑:AndyC 说了什么!

    【讨论】:

      【解决方案3】:

      使人抽象和公开,这将防止任何人实例化它。那么学生应该是公开的。

      还有一些其他选择,例如将学生的构造函数设为私有并在类上添加静态方法 Create。

      编辑:anothershrubery 说的 :)

      【讨论】:

      • 我认为您的意思是个人构造函数私有,但这是我要建议的,也是 .NET 框架的工作方式。将整个类抽象化会导致更多问题。
      【解决方案4】:

      如果您想将继承类定义为private,则您的基类不能是public。我认为您想要的答案是使 Person 成为 abstract 类。

      【讨论】:

        【解决方案5】:

        使 Person 抽象是一种方法,通常是最好的方法。然而,这并不总是可行的。在您自己的代码中可能存在这样一种情况,您只需要一个 Person,但仍然不希望在您的控制之外实例化基类的实例。

        如果您需要这样做,请将 Person 设为公开而非抽象,但将其构造函数设为内部。这将允许仅从同一程序集中的代码中调用构造函数,因此您可以实例化基 Person 执行幕后工作,同时仍防止外部代码实例化基类。

        您还可以将所有类(Person 和 Student)设为私有或内部,然后定义一个公共工厂类,它将派生自 Person 的实例分发为公共接口 IPerson 的实现。这使您不仅可以控制对实际类的访问,还可以控制这些类的实例化和水合。如果 Student 或 Person 需要外部代码不应该直接知道的其他资源,或者如果您实施限制对 Person 或 Student 中数据的访问的安全性,这将是很好的。

        【讨论】:

          猜你喜欢
          • 2022-01-08
          • 1970-01-01
          • 1970-01-01
          • 2018-07-01
          • 1970-01-01
          • 2019-11-14
          • 2020-11-28
          • 2023-02-21
          • 2023-03-24
          相关资源
          最近更新 更多