从类继承是不是很好的c#样式,在重命名类时保证向后兼容性?例如,如果在脚本中使用了类,并且在重构时无法轻松重命名?
例如:
public class NewClass { // Implementation }
[Obsolete("Is obsolete, please use NewClass instead")]
public class OldClass : NewClass { // EMPTY! }
或者我在这里错过了什么?
非常感谢
答案 0 :(得分:3)
我认为让一个markerclass从旧类继承将是对继承的错误使用。 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
对于Future,考虑为您的公共API提供interface
并尽可能地返回它们。这使得交换实现变得更容易:
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,但不会相互继承(它们是相同的继承层次结构的级别。