如果两个 class 实现相同的接口,如何使用另一个 class 的方法

How to use a method from another class if both classes implement the same interface

所以这是我正在尝试做的一个例子:

 public interface IFlyable
    {
        void Fly();
    }
    internal abstract class Insect { }
    internal class Bee : Insect, IFlyable
    {
        public void Fly()
        {
            //some implementation
        }
    }
    internal class Hornet : Insect, IFlyable
    {
        public void Fly()
        {
            //here I want the same implementation as in Bee.Fly()
        }
    }

作为一个不希望只是复制粘贴实现的新手,我能想到的唯一有意义的方法是为飞虫制作另一个 asbtract class 并从那里继承所需的一切:

internal abstract class Insect { }
internal abstract class FlyingInsect : Insect, IFlyable
{
 public void Fly()
 {
    //implementation
 }
}
internal class Bee : FlyingInsect
{

}
internal class Hornet : FlyingInsect
{

}

尽管这解决了我的问题,但我仍然想知道有什么更好的替代方法可以做到这一点,尤其是如果有一种方法可以不创建另一个“统一”class,但是相反 calling/taking 这个已经从另一个使用相同接口的 class 实现的方法。 提前致谢。

这取决于你想要什么样的耦合,但是如果 所有 飞虫将使用该实现(或者只有少数不使用),你选择中间 class 似乎是合理的;t,您可以根据需要覆盖它)。这里有一些其他选项:

  • Insect 添加一个内部方法,BeeHornet 都调用(不过,如果它仅适用于飞虫,这似乎有点奇怪)
  • Bee 添加一个 Hornet 调用的静态方法(Bee.Fly 也必须调用它)
  • 在其他位置添加静态方法(“实用程序”或“帮助程序”方法?),两者都会调用。

请注意,没有一种“聪明”的方法可以自动调用其他 class 的实现,只是因为它们实现了相同的接口。从表面上看,实现共享行为的中间类型似乎是最佳选择。