我有c#的类库。与班级'学生'。它继承自'人'。
我希望类库的用户能够实例化班级学生而不是人。
我尝试了以下内容:
public class person
和
private class student : person
但是我得到了编译错误:
命名空间中定义的元素不能 明确声明为私有, 受保护或受保护的内部。
这是为什么?我想暴露人而不是潜在的基础类型。
答案 0 :(得分:10)
将您的Person类声明为abstract
。这意味着它无法实例化。
抽象类不能实例化为对象,仅用于派生子类。
public abstract class Person
{
// members here
}
public class Student : Person
{
// members here
}
有关详细信息,请参阅this MSDN article。
答案 1 :(得分:2)
我会制作Person
班abstract
。
答案 2 :(得分:1)
使人抽象和公开,这将阻止任何人实例化它。然后学生应该公开。
还有其他一些选择,例如将学生的构造函数设为私有,并在类上添加一个静态方法来创建。
编辑:anothershrubery所说的:)
答案 3 :(得分:0)
如果要将继承类定义为public
,则基类不能为private
。我想你想要的答案是Person
abstract
类。
答案 4 :(得分:0)
使人抽象是一种方式,通常是最好的方式。然而,它并不总是可行的;在您自己的代码中可能存在一个只需要Person的情况,但仍然不希望在您的控件之外实例化基类的实例。
如果您需要这样做,请将Person设为public而不是abstract,但将其构造函数设为内部。这将允许仅从同一程序集中的代码调用构造函数,因此您可以将基本Person实例化为幕后工作,同时仍然阻止外部代码对基类进行实例化。
您还可以将所有类(Person和Student)设为私有或内部,但是然后定义一个公共工厂类,它将派生派生的实例作为公共接口IPerson的实现。这使您不仅可以控制对实际类的访问,还可以控制这些类的实例化和水化。如果学生或个人需要外部代码不应直接了解的其他资源,或者您实施限制访问个人或学生中数据的安全性,那么这将是很好的。