c# – 覆盖不同兼容类型的属性

前端之家收集整理的这篇文章主要介绍了c# – 覆盖不同兼容类型的属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要一个带有属性的基类,我可以派生具有相同属性但不同(兼容)类型的类.基类可以是抽象的.
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);
    }
}

基本上我已经在中间添加了一个泛型类,用于存储正确类型的属性.这将工作,假设您不需要从迭代列表< Base>的成员的代码访问Prop. (您可以随时添加一个抽象方法,将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#相关文章