【问题标题】:Is it possible to define member on a child class without defining it on the abstract parent class? C#是否可以在子类上定义成员而不在抽象父类上定义它? C#
【发布时间】:2011-02-12 16:47:52
【问题描述】:
澄清一下,一个子类的所有成员都必须声明在它上面的抽象类上吗?
可能是这样的:
public abstract class MyParent
{
public int x { get; set; }
}
public class MyChild : MyParent
{
public int x { get; set; }
public string MyName { get; private set; }
}
这只是一个例子……在这种情况下,属性MyName没有在父类中定义,而是在子类中……可以吗?
提前致谢!
【问题讨论】:
标签:
c#
inheritance
abstract-class
【解决方案1】:
是的,您可以在子类中声明其他属性和方法。
但是,如果您使用声明为祖先类型的变量,您将只能通过该变量访问定义在祖先类型中的成员。获得子类特殊内容的唯一方法是向下类型转换为子类型。
顺便说一句:子类应该不重复在祖先中所做的声明。您的 int x 属性将导致问题,因为将有两个不同的 x 属性运行。
需要一个具体的(非抽象的)子类来覆盖抽象祖先中声明的任何虚拟方法或属性。虚拟和覆盖都需要声明中的特定关键字。
【解决方案2】:
是的,你这样做当然很正常。但是,您唯一不能做的就是访问 MyName 属性,如果您要通过父级。在这种情况下,您将只能访问 MyParent 共有的那些。
【解决方案3】:
是的,可以在子类中创建不在父类中的新成员。这就是开设子课程的全部意义所在。子类应该通过添加新成员或修改现有成员的行为来“扩展”父类
但是,您无需在子类中重新创建父类成员。子类自动获取父类的所有成员。
您提供的代码是合法的 C# 程序,这意味着您的意图是为子类创建不同的 int x。通常情况并非如此,Microsoft C# 编译器会给您一个警告。