我有一个名为A的抽象类,以及其他实现A的类(B,C,D,E,...)。我的派生类保存不同类型的值。我还有一个 A 对象列表。
abstract class A { }
class B : class A
{
public int val {get;private set;}
}
class C : class A
{
public double val {get;private set;}
}
class D : class A
{
public string val {get;private set;}
}
class Program
{
static void Main(string[] args)
{
List list = new List { new B(), new C(), new D(), new E() };
// ...
foreach (A item in list)
{
Console.WriteLine(String.Format("Value is: {0}", item.val);
}
}
}
。其中 .val 不被基类 ofc 知道。
如何获得这种动态行为?我不想在长开关/if语句中使用getType。
如果你只想在每个子类中获取 val i recoment 覆盖 ToString 的字符串表示
形式public override string ToString()
{
return val.ToString();
}
无论哪种方式,如果您希望数据在子类中,您需要在基类中将其表示为它们都具有的某种共同类型(如对象)。 你可以这样做
abstract class A
{
public abstract object GetValue();
}
class B : class A
{
public int val {get;private set;}
public override object GetValue()
{
return val;
}
}
试试这个:
using System;
using System.Collections.Generic;
abstract class A
{
public abstract dynamic Val { get; set; }
}
class B : A
{
public override dynamic Val { get; set; }
}
class C : A
{
public override dynamic Val { get; set; }
}
class D : A
{
public override dynamic Val { get; set; }
}
class Program
{
static void Main(string[] args)
{
var list = new List<A> { new B(), new C(), new D() };
// ...
foreach (A item in list)
{
Console.WriteLine(String.Format("Value is: {0}", item.Val));
}
}
}
abstract class A { public string val { get; set; } }
class B : A
{
public int val {get;private set;}
}
class C : A
{
public double val {get;private set;}
}
class D : A
{
public string val {get;private set;}
}
class Program
{
static void Main(string[] args)
{
List<object> list = new List<object> { new B(), new C(), new D() };
// ...
foreach (A item in list)
{
Console.WriteLine(String.Format("Value is: {0}", item.val));
}
}
}
如果val
不是基类的成员,则无法在该类型的引用上访问它。 这三个派生类可能都有一个名为 val
的成员,但它不是同一个成员,因此不能按原样处理。 您可以做的是声明一个泛型类并将该val
属性设置为泛型类型的属性,但随后无法创建该类型的 List。 基本上,你想做的事情是不可能的。 它不基于继承,也不基于泛型。 这听起来很方便,但不合逻辑。