gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:53:02 24 4
gpt4 key购买 nike

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

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

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;
}

P.s 我是 c# 的新手,而且我的英语可能不好,抱歉。

最佳答案

这是你可以做的:

Cast对象

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;
}

但请考虑重新考虑您的设计:

但我会重新考虑您的设计,因为您正在进入 Liskov substitution此处违规。

这里是重新设计的尝试。如果您只访问与该特定实例关联的变量,则无需将父对象传递到方法中。如果您想访问另一个 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();
}
}

关于c# - 如何让程序知道父类的对象也是子类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57667738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com