为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
富国沪深 2023-09-24 16:17:16
我有一个具有某些字段的父抽象类,并且我还有一个具有附加字段的子类。有一个方法将父类的对象作为输入,但如果我给它一个子类对象,我也需要使用它的字段。如果我直接这样做会出错。我找不到访问子字段的方法,并且在不将子字段设为父字段的情况下唯一可行的方法是创建对象的每个字段的数组。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# 很陌生,而且我的英语可能很糟糕,抱歉。
查看完整描述

2 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

这是你可以做的:

投射物体

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();

    }

}


查看完整回答
反对 回复 2023-09-24
?
撒科打诨

TA贡献1934条经验 获得超2个赞

作为一个抽象类,您可能希望避免处理子对象实例。与前面的答案一样,尝试在子级中重写该方法,并且您可以使用“base”关键字调用基类功能。在 VS 中,当您重写时,它会自动注入该基本调用作为默认语法。



查看完整回答
反对 回复 2023-09-24
  • 2 回答
  • 0 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信