我需要一个带有属性的基类,我可以派生具有相同属性但不同(兼容)类型的类.基类可以是抽象的.
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 //... } }
解决方法@H_502_10@
这是提出解决方案的另一种方法:
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();
}
}
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(); } }