抽象基类实现派生类接口方法

时间:2012-02-23 15:28:54

标签: c# .net interface abstract-class

我有以下类和接口。我想基本上冻结IOld接口(将被弃用)并强制用户使用INew接口,该接口将包含与IOld相同的方法。然而,INew方法Meth3代表与IOld Meth2相同的功能但具有不同的返回类型,为了更好地区分它们,我认为这种设计是合适的。我的问题是,这被认为是良好的编码实践吗?

注意:IOld和INew存在于单独的程序集中。 NewClass不能以任何方式引用IOld,因为它将作为客户端将通过INew接口连接的可远程(MarshalByRef)对象公开。我不希望新客户端引用IOld程序集。

public interface IOld
{
    void Meth1();
    double Meth2(int input);
} 

public interface INew
{
    void Meth1();
    float Meth3(int input);
} 

public abstract class BaseClass
{
    public virtual void Meth1()
    {
    } 

    public virtual double Meth2(int input)
    {
        throw new NotImplementedException();
    } 
} 

public class OldClass
:
    BaseClass,
    IOld
{
    public override double Meth2(int input)
    {
        return 0;
    } 
} 

public class NewClass
:
    BaseClass,
    INew
{
    public float Meth3(int input)
    {
        return 0;
    } 
}

3 个答案:

答案 0 :(得分:3)

坐下来,用坚实的底座建造你的金字塔。您设置的方式,抽象基类和接口是实现相同概念的竞争方法。你这样做主要是为了方便Old和New,但是当你这样做时,你会得到一个相当时髦的依赖图。

根据你所写的内容,你唯一的问题是具有相同签名的方法。如果不是这个问题,您可以轻松扩展旧界面,而不是最终出现问题。如果该方法在新方法中发生变化,是重构更改(可接受)还是完全不同的结果?换句话说,旧客户端可以调用新的吗?如果是这样,则不需要在不同的接口上使用该方法。

确保您弃用这些方法,以便用户意识到他们将丢失旧方法。还要确保记录在案。

答案 1 :(得分:2)

我会尝试这样的事情:

public class OldClass : BaseClass, IOld
{
    public override double Meth2(int input)
    {
        return 0.0;
    }
}

public class NewClass : OldClass, INew // now implements IOld and INew using the Method2() from OldClass
{
    [Obsolete("This method is deprecated . Use Method3() instead.")]
    public override double Meth2(int input)
    {
        return base.Meth2(input);
    }
    public float Meth3(int input)
    {
        return return 0.0f;
    }
}

将方法标记为已弃用以通知开发人员需要更新其代码而不是通过终止旧方法来破解它,这被认为是更好的做法。

答案 2 :(得分:2)

我更愿意添加一个名称不同的新方法,而不是创建新的界面。

所以旧的界面将是例如:

public interface IOld
{
    void Meth1();
    [Obsolete("Use Meth22 instead.")]
    double Meth2(int input);
    float Meth22(int input);
}