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

时间:2015-11-12 09:00:19

标签: c# .net class rename

从类继承是不是很好的c#样式,在重命名类时保证向后兼容性?例如,如果在脚本中使用了类,并且在重构时无法轻松重命名?

例如:

public class NewClass { // Implementation }

[Obsolete("Is obsolete, please use NewClass instead")]
public class OldClass : NewClass { // EMPTY! }

或者我在这里错过了什么?

非常感谢

1 个答案:

答案 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();
    }
    // [...]
}

这是您的解决方案和我希望的方式的混合,因为NewClassOldClass必须共享一个公共API,但不会相互继承(它们是相同的继承层次结构的级别。