【发布时间】:2017-09-21 06:22:38
【问题描述】:
关于继承、隐藏和覆盖的一个小问题。
我有以下课程:
public class A
{
public BasicProject project { get; set; }
public int a {get; set;}
}
public class B : A
{
public AdvancedProject project { get; set; }
public int b {get; set;}
}
public class C : A
{
public new AdvancedProject project { get; set; }
public int c {get; set;}
}
public class BasicProject
{
public int p1 {get; set;}
public int p2 {get; set;}
}
public class AdvancedProject : BasicProject
{
public int p3 {get; set;}
public int p4 {get; set;}
}
我还有一些功能
A show(A x)
{
x.project.p1;
x.project.p2;
x.project.p3;
x.project.p4;
}
问题在于,当我将B(或C)类型的对象传递给函数时,x.project 指的是BasicProject 类型而不是AdvancedProject。
【问题讨论】:
-
那是因为方法只知道
A。如果您想访问B属性,您应该在内部强制转换为B或使用泛型。 -
那是因为
project在A中不是虚拟的,如果是,你必须在B中override它,即使那样它仍然必须具有相同的类型. -
@juharr 添加虚拟/覆盖导致编译错误“类型必须是'BasicProject'才能匹配覆盖”成员'A.project'
-
@Ilan 是的,我说过类型必须相同才能覆盖它们。否则,您只能隐藏该属性,并且必须像 Zohar 所说的那样通过转换为
B来引用它。我不确定这是否只是一个学习练习,或者这是否是你正在尝试的东西的淡化版本,但如果是后者,那么你可能想要描述你试图使用它的目的,因为这看起来像设计问题。 -
根本问题是违反替换规则的无效设计。
标签: c# oop inheritance overriding virtual