c# - 静态字段之类的继承

标签 c# inheritance static

这个问题更具理论性,它不是家庭作业或重要项目的一部分......我问这个问题是因为我认为这可能很容易知道,但我找不到一个合适的答案。

问题描述:

  • 每个从我的抽象类继承的类都应该强制提供一个符号图像。

  • 符号不应在运行时更改

  • 实例不应包含图像[以节省内存]

  • 在运行时通知开发人员的解决方案[可能通过使用反射]是 Not Acceptable (这是一个更理论的问题) .

.

abstract class A
{
    public static abstract Image Symbol{get;}
}
class B:A
{
  //this Field should be forced for every class that inherits from A
  public static override Image Symbol{get{return....}}
}

当然,我可以使用 readonly 关键字来代替 static

但这意味着类 B 的每个实例都会产生额外的图像,因为 readonly 允许在运行时在构造函数中设置字段 ...导致内存浪费...也许不是巨大的内存浪费,因为或多或少会有引用浪费,但它仍然在浪费东西... [如果我错了请纠正我。]

那么...如何通过使用继承规则实现这种简单而美好的效果?

最佳答案

不可能使静态成员抽象/虚拟,因为多态性基于实例的实际类型,而静态成员不属于特定实例。

我认为这满足您的所有要求:

abstract class A
{
    public abstract Image Symbol{get;}
}
class B:A
{

  private static readonly Image _symbol = ...

  public override Image Symbol{get{return _symbol;}}
}
  • 每个派生类都必须实现 Symbol,因为它在基类中是抽象的
  • 静态字段是只读的,因此初始化后无法更改
  • 该实例不包含图像实例,它在该类的所有实例之间共享
  • (不过不确定最后一个是什么意思......)

当然,缺点是它要求所有派生类都遵守此模式。这并不能阻止派生类违反某些要求。

关于c# - 静态字段之类的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32386521/

相关文章:

c# - 从 XML 到 PLIST 的转换

c# - 如何在多种方法中很好地使用try catch?

c# - 部分代码在本地主机上运行正常但在服务器上运行错误(iis)

c# - 隐藏派生类

scala - 用提取程序替换案例类继承,保留Scala中的详尽性检查

objective-c - 在 Objective C 中实例化变量之前先将其设置为 nil 有什么意义

c# - 测试在最小起订量中多次调用的方法

ios - Swift 3 (SpriteKit) 从自定义类中将子项添加到 GameScene

java - 这段代码有竞争条件吗?

static - 为什么不能将用于内存函数的静态散列图借用为可变的?