gpt4 book ai didi

c# - 如何使用相同的公开接口(interface)扩展/定义接口(interface)?

转载 作者:行者123 更新时间:2023-11-30 15:51:40 26 4
gpt4 key购买 nike

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

我知道“只需创建一个新界面”即可提供新功能,但随后我必须更新代码中的所有旧界面引用才能使用新界面。

我想知道这是比创建新界面和更新所有引用更好的主意

假设我从这个开始:

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

当然,我的类(class)看起来像这样,我不会展示类(class)中的所有方法和属性,因为它们与手头的主题无关。

public class MyWaiter : MyWorker, iMyWaiter
{
}

现在假设我想将 iMyWaiter 更新到版本 2,执行该操作的“正常”方法是创建一个新界面:

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

并从新接口(interface)派生类:

public class MyWaiter : MyWorker, iMyWaiter2
{
}

这会产生搜索 iMyWaiter 的引用并将其替换为 iMyWaiter2 的成本

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

现在变成:

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

我想做的是制作一个派生自版本化接口(interface)的通用“iWaiter”接口(interface)和一个派生自版本化接口(interface)的通用类:

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
{
}

所以基本上这个接口(interface)和类总是可以创建,我的代码永远不会改变,除了使用新接口(interface)公开的新功能

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

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

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

我的问题:

这是一个好的设计实践吗?

缺点是什么?

我没有考虑什么?

最佳答案

假设您有依赖于 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 的类开始。它们是更改的原因,因此您无需搜索它们。反其道而行之,向接口(interface)添加其他类不需要的方法是没有意义的。

添加方法不是破坏性更改这一事实应该消除了仅仅因为添加了新方法而创建新的“版本化”接口(interface)的需要。

如果您确实需要创建一个版本控制的界面,上述内容也适用。您将创建新接口(interface),因为某些类需要它。您不需要更新所有使用 V1 的类,以便它们现在使用 V2。如果你这样做了,就根本不需要保留 V1。

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

关于c# - 如何使用相同的公开接口(interface)扩展/定义接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56466839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com