首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >伪静态虚拟C#机制

伪静态虚拟C#机制
EN

Stack Overflow用户
提问于 2010-10-30 01:15:08
回答 6查看 970关注 0票数 1

我想让我的类拥有用于标识这个类的参数ID。例如,我想要这样的内容:

代码语言:javascript
复制
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静态:/

EN

回答 6

Stack Overflow用户

发布于 2010-10-30 01:20:41

我可能有点糊涂了,但是如果你不使用静态方法,你所写下的东西就是你所能得到的。你似乎在问“如何让静态方法像实例方法一样工作”。答案是is...use实例方法和正常的多态性?

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

票数 7
EN

Stack Overflow用户

发布于 2010-10-30 02:02:49

Adam Wright在这一点上说得很好。Statics不是多态的,但它看起来是多态的行为。

问题似乎是因为静态存在于类级别而不是实例级别,您不能利用多态性,因为您正在处理的不是可能覆盖行为的实例。

可能会有一些混淆,因为您的示例代码看起来像是试图以非静态方式处理属性。当访问汽车的静态ID属性时,该属性在Car...not实例a上公开。这可能看起来很奇怪,但重要的是要记住,对Car.ID的调用与实例a的类型无关。因此,无法从实例a的创建方式得出任何级别的推断;即,仅仅因为实例a恰好是一个SuperCar,就无法知道下一次对Car.ID的调用实际上应该被解释为对SuperCar.ID的调用。

不过,您可以通过虚拟实例级属性封装对相应静态属性的调用来模拟此静态属性的多线程行为。

下面这样的代码可能会给你想要的东西:

代码语言:javascript
复制
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);
    }
}
票数 4
EN

Stack Overflow用户

发布于 2010-10-30 01:17:21

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4054287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档