伪静态虚拟C#机制

时间:2010-10-29 17:15:08

标签: c#

我想让我的类有参数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

你觉得有什么可以做出类似的东西吗?我现在无法做出虚拟的静态:/

6 个答案:

答案 0 :(得分:7)

我可能会很紧张,但是如果你没有使用静态方法,那么你所记下的内容正是你所得到的。您似乎在问“如何使静态方法像实例方法一样”。答案是......使用实例方法和普通多态?

如果这只是获取类的标识符,GetType()成员就足够了。

答案 1 :(得分:4)

Adam Wright在这里遇到了一个好点。静态不是多态的,但看起来正在寻找的行为是多态的行为。

问题似乎是因为静态存在于类级而不是实例级,所以你不能利用多态,因为你没有处理可能覆盖行为的实例。

有些混淆可能来自这样一个事实,即您的示例代码看起来像是试图非静态地处理该属性。当访问Car的静态ID属性时,该属性在Car上公开...而不是实例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);
    }
}

答案 2 :(得分:2)

您可以使用a.GetType().Name;

答案 3 :(得分:1)

我不确定为什么你只需要参考类型本身就需要这样做。

 var car = new SuperCar();
 if (car is SuperCar)
 {
   ...
 }

或者如果您需要实际名称作为文本

 var className = car.GetType().Name;

答案 4 :(得分:1)

我正在尝试做的更好的方法是使用属性。

[MyAttribute("Car")]
public class Car
{ ... }

现在,您可以使用反射来查找类中的所有属性,无论您是对类型的引用还是对它的实例的引用。

答案 5 :(得分:0)

您可以删除代码中的虚拟和覆盖关键字并使用new关键字,但我仍然同意tvanfosson。

因此,该属性不再从父类继承而是绝对新的。