如何使用相同的公开接口扩展/定义接口?

时间:2019-06-05 19:28:24

标签: c# interface

当我必须更新类中的接口时,我希望尽量减少代码更改的次数。

我了解“只是创建一个新接口”以提供新功能,但是随后我必须更新代码中的所有旧接口引用才能使用新接口。

我想知道的是,这比创建一个新界面和更新所有引用更好。

比方说,我从这个开始:

public interface iMyWaiter : iMyWorker
{
    void takeOrder();
}

当然,我的课程看起来像这样,并且由于它们与当前主题没有密切关系,因此我不会显示该类中的所有方法和属性。

public class MyWaiter : MyWorker, iMyWaiter
{
}

现在让我们假设我想将iMyWaiter更新到版本2,要做的“正常”方法是创建一个新界面:

public interface iMyWaiter2 : iMyWaiter
{
    void getBill();
}

并从新接口派生该类:

public class MyWaiter : MyWorker, iMyWaiter2
{
}

这会导致搜索iMyWaiter的引用并将其替换为iMyWaiter2的费用

iMyWaiter waiter = new MyWaiter();
waiter.takeOrder();

现在变为:

iMyWaiter2 waiter = new MyWaiter();
waiter.takeOrder();

我正在考虑做的是制作一个通用的“ iWaiter”接口,该接口派生于版本化的接口,而一个通用类派生于版本化的接口:

public interface iMyWaiter_1 : iMyWorker
{
    void takeOrder();
}
public class MyWaiter_1 : MyWorker, iMyWaiter_1
{
}


public interface iWaiter : iMyWaiter_1
{
}
public class MyWaiter : MyWaiter_1, iMyWaiter
{
}

现在,当我需要更新界面时,只需在通用界面和上一个版本之间挤压新界面即可:

public interface iMyWaiter_1 : iMyWorker
{
    void takeOrder();
}
public class MyWaiter_1 : MyWorker, iMyWaiter_1
{
}


public interface iMyWaiter_2 : iMyWaiter_1
{
    void getBill();
}
public class MyWaiter_2 : MyWaiter_1, iMyWaiter_2
{
}

因此从本质上讲,该接口和类始终可以创建,并且我的代码从未更改,除非使用新接口公开的新功能

public interface iWaiter : iMyWaiter_2
{
}
public class MyWaiter : MyWaiter_2, iMyWaiter
{
}

现在,我可以简单地将“ getBill”函数添加到我的代码中,而不必担心接口:

iMyWaiter waiter = new MyWaiter();
waiter.takeOrder();
waiter.getBill();

我的问题:

这是一种好的设计习惯吗?

有什么缺点?

我没有考虑什么?

1 个答案:

答案 0 :(得分:3)

假设您那里有依赖IWaiter的类:

public class FoodOrder
{
    private readonly IWaiter _waiter;

    public SmallRestaurant(IWaiter waiter)
    {
        _waiter = waiter;
    }

    // other methods, one of them needs the waiter.
}

...以及许多其他类似的类。这是您的IWaiter

public interface IWaiter
{
    Bill GetBill();
}

不应存在向IWaiter添加新方法,然后必须找到需要它的类并更新它们以使用新方法的情况。造成这种情况的原因有两个:

  • 这不是一个重大变化。如果其中之一不需要新方法,则可以忽略它。
  • 该过程应以其他方式进行。您将方法添加到IWaiter中,因为类需要他们的服务员来做新的事情。需求始于依赖于IWaiter的类。它们是更改的原因,因此您无需搜索它们。相反,在其他类不需要的接口上添加方法是没有道理的。

添加方法并非重大改变这一事实应该消除了仅仅由于添加了新方法而创建新的“版本化”接口的必要。

如果确实需要创建版本接口,则以上内容同样适用。您将要创建新接口,因为某些类需要它。您不需要更新所有使用V1的类,以便现在它们使用V2。如果这样做的话,根本就不需要保留V1。

如果我们已经发布了一些其他代码依赖的库,并且不想通过更改接口来破坏它们,那么版本控制可以防止破坏更改。如果所有内容都在我们自己的代码中,并且由于某种原因我们必须对接口进行重大更改,那么找到该接口的用法将非常容易。更改接口时,无论在何处使用该接口,都会出现编译器错误。