作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道“虚拟”成员和“静态”成员的概念在句法和概念上是截然相反的,但我正在尝试突破极限,看看是否有办法实现以下目标:
假设我有一个抽象类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/
我是一名优秀的程序员,十分优秀!