我想使用基类,但我不想让应用程序知道它我该怎么做? C#

时间:2011-02-04 16:09:31

标签: c#

我有c#的类库。与班级'学生'。它继承自'人'。

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

我尝试了以下内容:

public class person

private class student : person

但是我得到了编译错误:

  

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

这是为什么?我想暴露人而不是潜在的基础类型。

5 个答案:

答案 0 :(得分:10)

将您的Person类声明为abstract。这意味着它无法实例化。

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

public abstract class Person
{
 // members here
}

public class Student : Person
{
 // members here
}

有关详细信息,请参阅this MSDN article

答案 1 :(得分:2)

我会制作Personabstract

编辑:AndyC说的是什么!

答案 2 :(得分:1)

使人抽象和公开,这将阻止任何人实例化它。然后学生应该公开。

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

编辑:anothershrubery所说的:)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

如果您需要这样做,请将Person设为public而不是abstract,但将其构造函数设为内部。这将允许仅从同一程序集中的代码调用构造函数,因此您可以将基本Person实例化为幕后工作,同时仍然阻止外部代码对基类进行实例化。

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