我需要一个带有属性的基类,我可以在其中派生具有相同属性但不同(兼容)类型的类。基类可以是抽象的。
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/