我想让我的类拥有用于标识这个类的参数ID。例如,我想要这样的内容:
class Car
{
public static virtual string ID{get{return "car";}}
}
class SuperCar : Car
{
public static override string ID{get{return "superCar";}}
}
Car a = new Car();
//a.ID == car
a = new SuperCar();
//a.ID = superCar你认为为什么要做这样的东西吗?我现在不能使virutal静态:/
发布于 2010-10-30 01:20:41
我可能有点糊涂了,但是如果你不使用静态方法,你所写下的东西就是你所能得到的。你似乎在问“如何让静态方法像实例方法一样工作”。答案是is...use实例方法和正常的多态性?
如果这只是为了获取类的标识符,那么GetType()成员就足够了。
发布于 2010-10-30 02:02:49
Adam Wright在这一点上说得很好。Statics不是多态的,但它看起来是多态的行为。
问题似乎是因为静态存在于类级别而不是实例级别,您不能利用多态性,因为您正在处理的不是可能覆盖行为的实例。
可能会有一些混淆,因为您的示例代码看起来像是试图以非静态方式处理属性。当访问汽车的静态ID属性时,该属性在Car...not实例a上公开。这可能看起来很奇怪,但重要的是要记住,对Car.ID的调用与实例a的类型无关。因此,无法从实例a的创建方式得出任何级别的推断;即,仅仅因为实例a恰好是一个SuperCar,就无法知道下一次对Car.ID的调用实际上应该被解释为对SuperCar.ID的调用。
不过,您可以通过虚拟实例级属性封装对相应静态属性的调用来模拟此静态属性的多线程行为。
下面这样的代码可能会给你想要的东西:
class Program
{
class Car
{
// NOTE: this can't have the same name as the static method
public virtual string CarType
{
get { return ID; }
}
public static string ID { get { return "car"; } }
}
class SuperCar : Car
{
// NOTE: this can't have the same name as the static method
public override string CarType
{
get { return ID; }
}
public static string ID { get { return "super car"; } }
}
static void Main(string[] args)
{
Car a = new Car();
Console.WriteLine(a.CarType);
a = new SuperCar();
Console.WriteLine(a.CarType);
}
}发布于 2010-10-30 01:17:21
您可以只使用a.GetType().Name;
https://stackoverflow.com/questions/4054287
复制相似问题