Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
伪静态虚C#机构_C# - Fatal编程技术网

伪静态虚C#机构

伪静态虚C#机构,c#,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

我想使我的类具有标识该类的参数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静态化:///p>您可以使用
a.GetType().Name

您只需使用
a.GetType().Name

我不确定当您可以简单地引用类型本身时,为什么需要这样做

 var car = new SuperCar();
 if (car is SuperCar)
 {
   ...
 }
或者如果您需要实际名称作为文本

 var className = car.GetType().Name;

我不确定当您可以简单地引用类型本身时,为什么需要这样做

 var car = new SuperCar();
 if (car is SuperCar)
 {
   ...
 }
或者如果您需要实际名称作为文本

 var className = car.GetType().Name;

我可能有点糊涂,但你写下的东西正是你在不使用静态方法的情况下得到的。您似乎在问“如何使静态方法像实例方法一样工作”。答案是…使用实例方法和普通多态性


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

我可能很难理解,但如果不使用静态方法,您所写的内容正是您所能得到的。您似乎在问“如何使静态方法像实例方法一样工作”。答案是…使用实例方法和普通多态性


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

您可以删除代码中的虚拟关键字并覆盖关键字,然后使用新关键字,但我仍然同意tvanfosson的观点


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

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


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

Adam Wright在这里指出了一个很好的观点。静态不是多态性的,但看起来所寻求的行为是多态性的

问题似乎在于,由于静态存在于类级别而不是实例级别,因此不能利用多态性,因为您没有处理可能重写行为的实例

您的示例代码似乎试图以非静态方式处理属性,这一事实可能会引起一些混淆。当访问汽车的静态ID属性时,该属性在汽车上公开…而不是实例a。这似乎令人生畏,但重要的是要记住,对Car.ID的调用与实例a的类型无关。因此,从创建实例a的方式中无法得出任何级别的推断;i、 e.因为实例a恰好是一辆超级跑车,所以无法知道下一次对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);
    }
}

亚当·赖特(Adam Wright)在这里提出了一个很好的观点。静态不是多态性的,但看起来所寻求的行为是多态性的

问题似乎在于,由于静态存在于类级别而不是实例级别,因此不能利用多态性,因为您没有处理可能重写行为的实例

您的示例代码似乎试图以非静态方式处理属性,这一事实可能会引起一些混淆。当访问汽车的静态ID属性时,该属性在汽车上公开…而不是实例a。这似乎令人生畏,但重要的是要记住,对Car.ID的调用与实例a的类型无关。因此,从创建实例a的方式中无法得出任何级别的推断;i、 e.因为实例a恰好是一辆超级跑车,所以无法知道下一次对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);
    }
}

对于我认为您正在尝试做的事情,更好的方法是使用属性

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

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

我认为您尝试执行的更好方法是使用属性

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

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

Thx,这是一个很好的解决方案,但我无法生成Car id“c”和SuperCar“sc”,也无法生成Car.GetType().Name:/您可以生成typeof(Car)。Name@openglNewbie但是你可以做
typeof(超级跑车).Name
Thx,这是一个很好的解决方案,但我无法生成汽车id“c”和超级跑车“sc”,也无法生成汽车。GetType().Name:/您可以生成typeof(汽车)。Name@openglNewbie但是您可以执行
typeof(SuperCar).Name
在您的示例中,您将作为非静态的实例级属性访问ID,我认为这正是你需要做的,因为它提供了你正在寻找的多态行为。我不确定我是否理解您为什么首先尝试将属性设置为静态?在您的示例中,您将以非静态的实例级属性访问ID,我认为这正是您需要做的,因为它提供了您正在寻找的多态行为。我不知道我是否理解你为什么要把这个属性设置为静态?