gpt4 book ai didi

c# - 分离接口(interface)和构造函数注入(inject)

转载 作者:太空宇宙 更新时间:2023-11-03 21:19:12 24 4
gpt4 key购买 nike

现在我有一种进退两难的境地。有一个类似于下面的类结构:

public interface IMammal
{
void Eat();
}

public interface IBarking
{
void Bark();
}

IBarkingIMammal 实例。从理论上讲,我们的动物可以是其中之一,也可以只是其中之一。 CowIMammalDogIMammalIBarking。理论上,我们甚至可以拥有会吠叫但不是哺乳动物的人。

public class Mammal : IMammal
{
public void Eat()
{
Console.Write("Om-nom-nom");
}
}

public class Cow : Mammal
{
}

public class Dog : Mammal, IBarking
{
public void Bark()
{
Console.Write("Bark-bark!!!");
}
}

这是一个农场,里面只有一只动物:

public class Farm
{
private readonly IMammal _animal;

public Farm(IMammal animal)
{
_animal = animal;
}

public void Feed()
{
_animal.Eat();
}

public void Guard()
{
var dog = _animal as IBarking;
if (dog != null)
dog.Bark();
}
}

我在这里看到的问题是,我们假设 IBarking 始终是 IMammal。这种设计有什么问题,如何解决?

最佳答案

这样简化的例子几乎没有任何意义。你错过了“问题案例”以及你想做什么。显示一个实现了 IBarking 但没有实现 IMammal 的类,以及将它传递给 Farm 时出现的问题。无论如何,鉴于前提:

  • 接口(interface) IMammal 存在。
  • 接口(interface) IBarking 存在。
  • 实现IBarking 的类没有实现IMammal
  • 类构造函数Farm 必须接受IBarking IMammal
  • 当前类构造函数接受 IMammal

在这种情况下,您要么需要一个新的构造函数、一个新的私有(private)成员和更多代码以在两者之间进行选择,要么需要一个重叠的接口(interface)。我会选择后者:IFarmable

那么你需要:

  • 公共(public)接口(interface) IMammal : IFarmable
  • 公共(public)接口(interface) IBarking : IFarmable
  • 公共(public)农场(IFarmable farmable){ ... }

很可能你有其他约束,比如“但我想对传递给构造函数的变量调用Eat(),但是你的描述(>“我们假设 IBarking 始终是 IMammal)不正确或不完整,您需要将 Eat() 移动到IFarmable 接口(interface)。

关于c# - 分离接口(interface)和构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31945697/

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