gpt4 book ai didi

c# - 如何合成静态虚拟/抽象成员?

转载 作者:行者123 更新时间:2023-11-30 18:37:25 25 4
gpt4 key购买 nike

我知道“虚拟”成员和“静态”成员的概念在句法和概念上是截然相反的,但我正在尝试突破极限,看看是否有办法实现以下目标:

假设我有一个抽象类Animal,它有一个属性NumberOfLegs。我的 Cat 类应该将 NumberOfLegs 定义为 4,而 Spider 应该有 8 条腿。我想要这样的代码(显然下面的代码无法编译):

public abstract class Animal {
public static abstract int NumberOfLegs { get; }

public void Walk() {
// do something based on NumberOfLegs
}
}

public class Cat : Animal {
public static override int NumberOfLegs { get { return 4; } }
}

public class Spider : Animal {
public static override int NumberOfLegs { get { return 8; } }
}

我希望它是静态的,因为它不依赖于实例;它仅取决于子类类型。

你会怎么做?

最佳答案

我认为对您来说最好的折衷方案是在每个类中为腿数创建一个常量。常量基本上是一个只读的静态成员,对于这个例子来说是有意义的,否则将其设为静态。

接下来,我将为 Animal 类定义一个抽象属性,并在每个子类中覆盖它。这将允许继承和多态性发挥作用,但该类的每个实例仍将引用相同的值。

public abstract class Animal
{
public abstract int NumberOfLegs { get; }

public void Walk()
{
// do something based on NumberOfLegs
}
}

public class Cat : Animal
{
private const int NumLegs = 4;

public override int NumberOfLegs { get { return NumLegs; } }
}

public class Spider : Animal
{
private const int NumLegs = 8;

public override int NumberOfLegs { get { return NumLegs; } }
}

至于不覆盖静态方法,我知道这不是您想听到的,但这是不可能的。首先,您通过指定类而不是来自对象的实例来使用像 Animal.Legs 或 Cat.Legs 这样的静态成员。因此,如果您将它定义为静态的,您甚至无法从该类的实例访问它,并且也不知道多态性(即接受通用“动物”的函数无法获得它有多少条腿并让它调用正确的属性)。如果您对它的工作原理感兴趣,我建议您阅读 Virtual Tables

关于c# - 如何合成静态虚拟/抽象成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12841456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com