【发布时间】:2011-06-21 11:19:18
【问题描述】:
我有 C# 类库。与班级“学生”。它继承自“人”。
我希望类库的用户能够实例化班级学生而不是人。
我尝试了以下方法:
public class person
和
private class student : person
但是我得到了编译错误:
命名空间中定义的元素不能 被明确声明为私有, 受保护或内部保护。
这是为什么?我想公开人员,但不公开底层的基本类型。
【问题讨论】:
标签: c#
我有 C# 类库。与班级“学生”。它继承自“人”。
我希望类库的用户能够实例化班级学生而不是人。
我尝试了以下方法:
public class person
和
private class student : person
但是我得到了编译错误:
命名空间中定义的元素不能 被明确声明为私有, 受保护或内部保护。
这是为什么?我想公开人员,但不公开底层的基本类型。
【问题讨论】:
标签: c#
将您的 Person 类声明为 abstract。这意味着它不能被实例化。
抽象类不能作为对象实例化,只能用于派生子类。
public abstract class Person
{
// members here
}
public class Student : Person
{
// members here
}
更多信息请参见this MSDN article。
【讨论】:
我会创建Person 类abstract。
编辑:AndyC 说了什么!
【讨论】:
使人抽象和公开,这将防止任何人实例化它。那么学生应该是公开的。
还有一些其他选择,例如将学生的构造函数设为私有并在类上添加静态方法 Create。
编辑:anothershrubery 说的 :)
【讨论】:
如果您想将继承类定义为private,则您的基类不能是public。我认为您想要的答案是使 Person 成为 abstract 类。
【讨论】:
使 Person 抽象是一种方法,通常是最好的方法。然而,这并不总是可行的。在您自己的代码中可能存在这样一种情况,您只需要一个 Person,但仍然不希望在您的控制之外实例化基类的实例。
如果您需要这样做,请将 Person 设为公开而非抽象,但将其构造函数设为内部。这将允许仅从同一程序集中的代码中调用构造函数,因此您可以实例化基 Person 执行幕后工作,同时仍防止外部代码实例化基类。
您还可以将所有类(Person 和 Student)设为私有或内部,然后定义一个公共工厂类,它将派生自 Person 的实例分发为公共接口 IPerson 的实现。这使您不仅可以控制对实际类的访问,还可以控制这些类的实例化和水合。如果 Student 或 Person 需要外部代码不应该直接知道的其他资源,或者如果您实施限制对 Person 或 Student 中数据的访问的安全性,这将是很好的。
【讨论】: