繁体   English   中英

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

[英]Can a child class fields be used in parent class?

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

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”

当您通过y没有任何了解的父类访问您的实例obj时,您肯定无法访问该成员,因为它仅在子类上定义。

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

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

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

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

另外如果上面的说法不清楚,除非有充分的理由,否则最好避免父类依赖子类的情况。

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

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

Parent parent = new Child();
Child child = (Child) parent;
child.y = 10;

但是您应该记住,如果parent包含另一种类型的对象,则Child child = (Child)parent可以抛出运行时异常。 例如,这段代码抛出一个运行时异常:

Parent parent = new AnotherChild();
Child child = (Child) parent;

您可以使用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。

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

在某些情况下,您的父类可能会服从子类(有关示例,请参见虚拟和抽象方法和属性)。 子类有可能通过考虑 y 的值来影响这些虚拟或抽象方法之一的行为,但父类不能在不声明此类属性的情况下公开该 y。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM