c# - 使用不同的兼容类型覆盖属性

标签 c# generics inheritance properties .net-2.0

我需要一个带有属性的基类,我可以在其中派生具有相同属性但不同(兼容)类型的类。基类可以是抽象的。

public class Base
{
    public virtual object prop { get; set; }
}

public class StrBase : Base
{
    public override string prop { get; set; } // compiler error
}

public class UseIt
{
    public void use()
    {
        List<Base> l = new List<Base>();
        //...
    }
}

我尝试使用泛型,但在使用该类时出现问题,因为我想在列表中存储不同类型的基类。

public class BaseG<T>
{
    public T prop { get; set; }
}

public class UseIt
{
    public void use()
    {
        List<BaseG> l = new List<BaseG>(); // requires type argument
        //...
    }
}

最佳答案

这是建议解决方案的替代方法:

public abstract class Base
{
    public abstract void Use();
    public abstract object GetProp();
}

public abstract class GenericBase<T> : Base
{
    public T Prop { get; set; }

    public override object GetProp()
    {
        return Prop;
    }
}

public class StrBase : GenericBase<string>
{
    public override void Use()
    {
        Console.WriteLine("Using string: {0}", Prop);
    }
}

public class IntBase : GenericBase<int>
{
    public override void Use()
    {
        Console.WriteLine("Using int: {0}", Prop);
    }
}

基本上,我在中间添加了一个通用类,用于存储您正确键入的属性。假设您永远不需要访问 Prop,这将起作用来自迭代 List<Base> 成员的代码. (如果需要,您始终可以向 Base 添加一个名为 GetProp 的抽象方法,将泛型转换为对象。)

示例用法:

class Program
{
    static void Main(string[] args)
    {
        List<Base> l = new List<Base>();

        l.Add(new StrBase {Prop = "foo"});
        l.Add(new IntBase {Prop = 42});

        Console.WriteLine("Using each item");
        foreach (var o in l)
        {
            o.Use();
        }
        Console.WriteLine("Done");
        Console.ReadKey();
    }
}

编辑:添加了 GetProp() 方法来说明如何从基类直接访问属性。

关于c# - 使用不同的兼容类型覆盖属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3141325/

相关文章:

c# - 后台按键监听器

c# - 有没有比字典更简单的链接两个数据值的方法?

c++ - 类继承不安全

java - java中具有继承性的构造函数

c# - MSTest 中的通用数据驱动单元测试

python - 我如何在python中将相同的列表对象分配给两个不同的变量名?

C#暂停程序执行

c# - 获取不以linq中的字母字符开头的记录

Scala 输入 : "Expected _$1, got T"

具有下界(超)类型的 Java 方法