【发布时间】:2015-03-16 10:44:44
【问题描述】:
我有一个类用作数据库中特定表的包装器。在这个类的构造函数中(我们称之为MyLookup)我们进行了一些初始化(例如读取一些元数据)。现在我应该在数据库中创建第二个表,它或多或少是第一个表的副本。
class MyLookup {
public const TABLE_NAME = "MYTABLE";
private readonly ITable table;
MyLookup() {
this.table = OpenTable(TABLE_NAME);
/* further init */
}
}
问题在于初始化代码或多或少与“基”表相同。唯一的区别是它的实际名称。通常我只需将常量TABLE_NAME 更改为可以在派生表类中覆盖的虚拟属性。但是该 const 可以在遗留代码中使用,因此将其更改为属性将导致也更改其访问权限(实例而不是静态)。那么如何通过只对MyLookup 进行最少更改来调用具有不同TABLE_NAME 的基本初始化?
【问题讨论】:
-
作为其中的一部分,您是否也不能更改旧代码?
-
@Belogix 不,不幸的是它的客户代码。
-
TABLE_NAME 常量真的是私有常量吗?我认为您在覆盖属性的情况下走在正确的轨道上 - 只需将其命名为不同的(属性)并让 TABLE_NAME 与 [Obsolete] 属性保持原样。
-
我不完全确定,但据我所知,如果你有一些 const,编译器不会生成变量,而是在每次使用 const 时传递确切的值。这发生在编译时。因此,如果您进行更改,这不会破坏现有代码(但将来会更难调试)。
-
@OndrejSvejdar 我已经考虑过将 const 标记为过时。可能是这样。
标签: c# inheritance constants