如何让程序知道父类的对象也是子类的对象

我有一个具有某些字段的父抽象类,并且我还有一个具有附加字段的子类。有一个方法将父类的对象作为输入,但如果我给它一个子类对象,我也需要使用它的字段。如果我直接这样做会出错。


我找不到访问子字段的方法,并且在不将子字段设为父字段的情况下唯一可行的方法是创建对象的每个字段的数组。


public abstract class Parent 

{

    public int ParentIntField;

    public void ParentMethod(Parent other) 

    {

        if (other is Child) 

        {

            int x = other.ChildIntField;

            //do some job with other.ChildIntField

        }

        //maybe do some job with other.ParentIntField

    }

}

public class Child: Parent

{

    public int ChildIntField;

}

PS 我对 C# 很陌生,而且我的英语可能很糟糕,抱歉。


富国沪深
浏览 96回答 2
2回答

明月笑刀无情

这是你可以做的:投射物体public abstract class Parent{    public int ParentIntField;    public void ParentMethod(Parent other)    {        if (other is Child) /// Can do: (other is Child child) to avoid manually casting        {            Child childObject = (Child)other; // We are casting the object here.            int x = childObject.ChildIntField;            //do some job with other.ChildIntField        }        //maybe do some job with other.ParentIntField    }}public class Child : Parent{    public int ChildIntField;}但请考虑重新考虑您的设计:但我会重新考虑你的设计,因为你在这里违反了里氏替换规则。这是重新设计的尝试。如果您仅访问与该特定实例关联的变量,则无需将父对象传递到该方法中。如果您想访问另一个 Parent 对象,则必须将 Parent 参数添加回方法中。public abstract class Parent{    public int ParentIntField;    virtual public void Manipulate()    {                    //maybe do some job with other.ParentIntField    }}public class Child : Parent{    public int ChildIntField;    public override void Manipulate()    {        int x = ChildIntField; //do some job with ChildIntField                    base.Manipulate();    }}

撒科打诨

作为一个抽象类,您可能希望避免处理子对象实例。与前面的答案一样,尝试在子级中重写该方法,并且您可以使用“base”关键字调用基类功能。在 VS 中,当您重写时,它会自动注入该基本调用作为默认语法。
打开App,查看更多内容
随时随地看视频慕课网APP