Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 2个接口的通用方法_C#_Interface - Fatal编程技术网

C# 2个接口的通用方法

C# 2个接口的通用方法,c#,interface,C#,Interface,我对C#有一点设计问题 我有一个IAnimal接口(带有一些方法)。 然后我有一个IMammal和IReptile接口(继承了两个IAnimal接口) 如果IMammal和IReptil类都需要一个方法,我该怎么办 我不能将此方法放在IAnimal接口中,因为它只涉及IMammal和iRetile(而不涉及其他动物),但我不想对此方法进行两次定义(听起来不太好)。您主要讨论的是接口隔离,因此只放在一个接口中,您可以定义一个仅由IMammal和IReptil实现或继承的单独的 另一种选择是,对于与

我对C#有一点设计问题

我有一个IAnimal接口(带有一些方法)。 然后我有一个IMammal和IReptile接口(继承了两个IAnimal接口)

如果IMammal和IReptil类都需要一个方法,我该怎么办


我不能将此方法放在IAnimal接口中,因为它只涉及IMammal和iRetile(而不涉及其他动物),但我不想对此方法进行两次定义(听起来不太好)。

您主要讨论的是接口隔离,因此只放在一个接口中,您可以定义一个仅由
IMammal
IReptil
实现或继承的单独的


另一种选择是,对于与行为无关的其他类型,也可以
抛出NotImplementedException()

您主要讨论的是接口隔离,因此,您可以定义一个单独的接口,该接口仅由
IMammal
IReptil
实现或继承

另一种选择是,对于与行为无关的其他类型,也可以
抛出NotImplementedException()

您有两个选择:

  • IMammal
    IReptile
    都实现了自身实现的
    imammalRectile
    。您可以在接口层次结构中创建一个附加级别。当您认为
    IMammal
    是一个
    imammalRectile
  • 创建第三个接口来定义所需的行为,并使
    IMammal
    IReptile
    IAnimal
    一起实现它。当您考虑到与
    IMammal
    行为类似的关系时,这是有意义的
  • 在给定示例的特定情况下,选项2似乎是可行的

    您有两个选择:

  • IMammal
    IReptile
    都实现了自身实现的
    imammalRectile
    。您可以在接口层次结构中创建一个附加级别。当您认为
    IMammal
    是一个
    imammalRectile
  • 创建第三个接口来定义所需的行为,并使
    IMammal
    IReptile
    IAnimal
    一起实现它。当您考虑到与
    IMammal
    行为类似的关系时,这是有意义的

  • 在给定示例的特定情况下,选项2似乎是可行的

    您可以创建一个通用接口,该接口由
    IMammal
    IReptile
    实现。但实际上,我们不太可能编写处理所有这些嵌套类型的代码。它还可以把你画进一个角落。有些东西需要哺乳动物和爬行动物使用的通用方法,但它与一些较低级别的接口不兼容

    相反,尝试创建接口,如
    IMoveBehavior
    IEatBehavior
    iProduceBehavior
    ,并将各种行为放在它们自己的类中

    这样,如果你想要一个给定的
    IMoveBehavior
    实现,你可以在任何类型的动物中使用它,即使它与其他使用该行为的动物没有任何共同之处


    您仍然可以使用继承。也许你通过各种行为“组合”了一只青蛙,现在你需要不同类型的青蛙。他们可能有很多共同点,所以继承是有意义的。但最好先从组合开始,然后看看是否出现了一种继承对我们有利的模式。如果我们从继承开始,它往往会绊倒我们。

    您可以创建一个通用接口,由
    IMammal
    IReptile
    实现。但实际上,我们不太可能编写处理所有这些嵌套类型的代码。它还可以把你画进一个角落。有些东西需要哺乳动物和爬行动物使用的通用方法,但它与一些较低级别的接口不兼容

    相反,尝试创建接口,如
    IMoveBehavior
    IEatBehavior
    iProduceBehavior
    ,并将各种行为放在它们自己的类中

    这样,如果你想要一个给定的
    IMoveBehavior
    实现,你可以在任何类型的动物中使用它,即使它与其他使用该行为的动物没有任何共同之处


    您仍然可以使用继承。也许你通过各种行为“组合”了一只青蛙,现在你需要不同类型的青蛙。他们可能有很多共同点,所以继承是有意义的。但最好先从组合开始,然后看看是否出现了一种继承对我们有利的模式。如果我们从继承开始,它往往会绊倒我们。

    把它放在一个新的界面中,只实现
    IMammal
    IReptile
    如何。。。等等?创建嵌套的层次结构可能会变得混乱。您可以创建一个包含哺乳动物和爬行动物的界面,在该界面中放置一些东西,然后创建另一个既不是哺乳动物也不是爬行动物需要的类型。现在你被画进了一个角落。相反,考虑不同行为的接口,并创建将它们组合成所需组合的类。通过这种方式,您可以获得重用,但不会将以后可能需要分离的东西耦合在一起。更喜欢方法复制而不是无意义的继承。这取决于您是否有希望将哺乳动物和爬行动物视为同一类型实体的用例(关于所讨论的方法/行为/特征)。如果没有这样的用例,就不需要引入另一层接口,只需在哺乳动物和爬行动物接口中分别保留方法定义。如果您有您需要的用例