c# - 继承对象的容器

标签 c# generics inheritance abstract

我有一个简单的类结构

abstract class A {
List<A> containerList;
...
}
class B : A {....}
class C : A {....}

我确保 containerList仅包含类 B 的元素或 C (因为列表填充了这些子类并且 A 是抽象的)。

现在,我想以某种方式在 A 中拥有一个基本属性/方法它将自身转换为对象的真实类型,即 BC .有一个抽象方法就好了,但重要的是要得到一个 Collection<T>BC对象,因为我有依赖于它的绑定(bind)。

最佳答案

Now, I'd like, somehow, to have a base property / method in A which would cast itself to whatever the real type of the object is, i.e. B or C.

我认为您正在混合使用转换转换。 Cast 是一种编译时构造,它仅确定在编译时如何绑定(bind)方法和属性。它不会更改基础对象。

没有必要进行转换,因为对象已经BC - 因为A 是抽象的,您不能拥有实际上 A 的对象。

因此,将基础集合作为 BCs 的集合返回的方法将只是:

public IEnumerable<B> GetBs()
{
    return containerList.OfType<B>();
}

public IEnumerable<C> GetCs()
{
    return containerList.OfType<C>();
}

如果您想要一种由调用者 确定类型的通用方法,您可以这样做:

public IEnumerable<T> GetTs<T>() where T:A
{
    return containerList.OfType<T>();
}

关于c# - 继承对象的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37351832/

相关文章:

c# - 将 PictureBox 中的图像调整到尽可能大,同时保持纵横比?

c# - 底层连接已关闭 : The connection was closed unexpectedly. 数据太大?

c# - 如何设置泛型类的基类属性

java - 为什么泛型类型的推断在这里不起作用?

c++ - 通过使用范围解析避免多重继承引起的歧义

C# Windows 服务 While 循环

c# - 如何在 C# 中处理/杀死锁定的线程

generics - `generic::write(formatted)` gfortran 中的子例程被其他派生类型调用

java - 使用已检查的异常重写方法

python - 在类构建过程中正确实现方法继承