这个问题更具理论性,它不是家庭作业或重要项目的一部分......我问这个问题是因为我认为这可能很容易知道,但我找不到一个合适的答案。
问题描述:
每个从我的抽象类继承的类都应该强制提供一个符号图像。
符号不应在运行时更改
实例不应包含图像[以节省内存]
在运行时通知开发人员的解决方案[可能通过使用反射]是 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/