从类继承以保证向后兼容性

本文关键字:兼容性 继承 | 更新日期: 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();
    }
    // [...]
}

这是您的解决方案和我更喜欢的方式的混合,因为NewClassOldClass必须共享一个通用 API,但不相互继承(它们位于继承层次结构的同一级别(。