从类继承以保证向后兼容性
本文关键字:兼容性 继承 | 更新日期: 2023-09-27 18:21:41
从
类继承以保证重命名类时的向后兼容性是好的 c# 样式吗?例如,如果在脚本中使用了类并且不能通过重构轻松重命名?
例如:
public class NewClass { // Implementation }
[Obsolete("Is obsolete, please use NewClass instead")]
public class OldClass : NewClass { // EMPTY! }
还是我在这里错过了什么?
谢谢
我认为让标记类从旧类继承将是继承的不良用法。 NewClass
不是一种特殊类型的OldClass
。事实上,OldClass
应该被删除,只是为了兼容性而存在,这可能会在未来的某个时候被放弃。因此,NewClass
实际上并不是要专门化OldClass
,而是要取代它。
组成和授权
public class NewClass
{
// [...]
public void SomeThing()
{
// you move all your stuff to the new class
}
// [...]
}
[Obsolete("Is obsolete, please use NewClass instead")]
public class OldClass
{
private NewClass newClass = new NewClass();
// [...]
public void SomeThing()
{
// and delegate your old class calls to that.
this.newClass.SomeThing();
}
// [...]
}
为什么
因为否则,您将无法在将来的某个时候安全地删除它,而不知道没有人在
NewClass myObject = new OldClass();
更好的是:提取interface
对于未来,请考虑为公共 API 提供interface
,并在可能的情况下返回这些 API。这使得交换实现更加容易:
public interface ISomeClass
{
void SomeThing();
}
public class NewClass : ISomeClass
{
// [...]
public void SomeThing()
{
// you move all your stuff to the new class
}
// [...]
}
[Obsolete("Is obsolete, please use NewClass instead")]
public class OldClass : ISomeClass
{
private NewClass newClass = new NewClass();
// [...]
public void SomeThing()
{
// and delegate your old class calls to that.
this.newClass.SomeThing();
}
// [...]
}
这是您的解决方案和我更喜欢的方式的混合,因为NewClass
和OldClass
必须共享一个通用 API,但不相互继承(它们位于继承层次结构的同一级别(。