有没有办法在父类构造函数或方法中使用子类字段或属性?
public class Parent
{
public Parent()
{
}
}
public class Child : Parent
{
public int y;
public Child()
{
}
}
class Program
{
static void Main(string[] args)
{
Parent obj = new Child();
obj.y = 10;
}
}
在上面的代码中,我无法访问字段'y'
否。从Parent继承的对象不一定具有int类型的属性y。事实上,这将违反Liskov替代原则(SOLID中的L)。这个原则意味着我应该能够将从Parent下降的类型的任何对象分配给该变量,逻辑应该可以工作。显然,如果我创建了一个名为Child2的类,它继承自Parent但没有y属性,或者将y声明为其他类型(例如DateTime),那么你的代码显然无法将值10赋给该对象实例。
在某些情况下,您的Parent类可以遵循子类(请参阅示例的虚拟和抽象方法和属性)。子类可能通过考虑y的值来影响这些虚拟或抽象方法之一的行为,但是父类不能在不声明这样的属性的情况下暴露y。
不,你做不到。这是因为ClassB的任何实例也是ClassA的实例,但反之亦然。
此外,如果上述陈述不明确,除非有充分的理由,否则最好避免父类依赖于子类的情况。
当您通过父类访问您的实例obj
时,它对y
一无所知,您肯定无法访问该成员,因为它只在子类上定义。
换句话说:每个Child
都是Parent
并且具有y
属性。但不是每个Parent
也是Child
。
因此你的参考obj
必须有编译时类型Child
,而不是Parent
:
Child obj = new Child();
obj.y = 10;
这是不可能的,因为您使用的是Parent类型的变量,而parent不会公开属性y。
要使用基类型变量从派生类型访问成员,您应该将变量显式转换为派生类型
Parent parent = new Child();
Child child = (Child)parent;
child.y = 10;
但是你应该记住,如果Child child = (Child)parent;
包含另一种类型的对象,parent
可以抛出运行时异常,例如,如果你在上面写过Parent parent = new AnotherChild();
您可以使用is
运算符来避免运行时异常
if (parent is Child)
{
Child child = (Child)parent;
child.y = 10;
}
或者更好地使用as
算子
Child child = parent as Child;
if (child != null)
{
child.y = 10;
}
as
运算符永远不会抛出异常。相反,如果无法转换对象,则结果为null。