可以在父类中使用子类字段吗?

问题描述 投票:-1回答:5

有没有办法在父类构造函数或方法中使用子类字段或属性?

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'

c# .net oop
5个回答
0
投票

否。从Parent继承的对象不一定具有int类型的属性y。事实上,这将违反Liskov替代原则(SOLID中的L)。这个原则意味着我应该能够将从Parent下降的类型的任何对象分配给该变量,逻辑应该可以工作。显然,如果我创建了一个名为Child2的类,它继承自Parent但没有y属性,或者将y声明为其他类型(例如DateTime),那么你的代码显然无法将值10赋给该对象实例。

在某些情况下,您的Parent类可以遵循子类(请参阅示例的虚拟和抽象方法和属性)。子类可能通过考虑y的值来影响这些虚拟或抽象方法之一的行为,但是父类不能在不声明这样的属性的情况下暴露y。


2
投票

不,你做不到。这是因为ClassB的任何实例也是ClassA的实例,但反之亦然。

此外,如果上述陈述不明确,除非有充分的理由,否则最好避免父类依赖于子类的情况。


2
投票

当您通过父类访问您的实例obj时,它对y一无所知,您肯定无法访问该成员,因为它只在子类上定义。

换句话说:每个Child都是Parent并且具有y属性。但不是每个Parent也是Child

因此你的参考obj必须有编译时类型Child,而不是Parent

Child obj = new Child();
obj.y = 10;

1
投票

这是不可能的,因为您使用的是Parent类型的变量,而parent不会公开属性y。


1
投票

要使用基类型变量从派生类型访问成员,您应该将变量显式转换为派生类型

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。

© www.soinside.com 2019 - 2024. All rights reserved.