c# - 将具有/相同基类的两个不同类放在同一个列表中的更好方法?

标签 c# inheritance

假设我有一个名为 BaseClass 的基类:

public BaseClase{
    public bool isCool;
}

现在假设我有两个继承自 BaseClass 的类

public Class1: BaseClass{
    public bool isGreen;
}

public Class2: BaseClass{
    public bool isPurple;
}

现在假设我想通过创建一个列表来创建一个包含 Class1 和 Class2 实例的列表;

var genericList = new List<BaseClass>();

接下来,让我们将 Class1 和 Class2 的实例添加到 genericList。

genericList.Add(new Class1());
genericList.Add(new Class2());

现在,这是我有一个问题。如果我想访问 Class1.IsGreen 或 Class2.IsPurple,我必须将 genericList 中的每个项目转换为 Class1 或 Class2。

foreach(var item in genericList){
    if(item is Class1){
        var temp = (Class1) item;
        temp.IsGreen = true;
    }
    if(item is Class2){
        var temp = (Class2) item;
        item.IsPurple = true;
    }
}

这就是您应该做事的方式吗?这对我来说似乎很笨重,而且我正在编写的使用这种代码结构的代码的复杂性已经失控。我是继承的新手,想了解这是否只是您应该做事的方式,或者是否有更好的选择。

最佳答案

这真的取决于你想做什么。如果您可以抽象出该属性,例如 IsSelected,那么您可以将其作为虚拟或抽象属性公开在您的 BaseClass 上。这样您就不必在 for 循环中强制转换项目。

或者您可以将其抽象为抽象/虚拟方法,例如 UpdateColor(bool)。然后每个派生类都可以覆盖它并为自己设置适当的属性。

还有其他几种替代方法,包括接口(interface)和扩展方法,您可以使用它们来使其更简洁。

关于c# - 将具有/相同基类的两个不同类放在同一个列表中的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6832630/

相关文章:

c# - 使用 NPPExec 脚本从 Notepad++ 中使用 csc.exe 编译 C#

c# - 在 ASP.NET Core 中重命名 AccountController

c# - 如何在父类中调用 EventHandler

java - 无法读取java中的继承值

java - 重写等于方法

c# - Xamarin - 上传到 App Store 时出现 Bundle Invalid 错误

C# 如何避免多个开关(委托(delegate)?)

c# - Server.UrlEncode(string s)... 没有

c++ - 基类函数不调用派生类函数

c++ - 部分函数/方法模板特化解决方法