当前位置: 首页 > 知识库问答 >
问题:

实现此接口的典型方法

段干楚青
2023-03-14

我有行不同类型的动物在我的动物表在我的数据库。

我有一个带Speak方法的IAnimal接口。

我有不同的动物类来实现IAnimal接口(狗、猫等)

您是否迭代记录检查类型,然后根据类型实例化正确的对象,然后调用它们的Speak方法。

这是使用接口的典型方式吗?

共有3个答案

皇甫通
2023-03-14

如果要在关系数据库中表示派生类型,则有以下选项:

  1. 每个派生类型都有它自己的表(例如,狗,猫等的不同表)
  2. 您将所有对象存储在动物表中,并在列中指定类型
  3. 您有一个动物表,其中包含动物之间的公共列,以及特定列的单独表。

您似乎选择了选项2。

通常,您将使用I差接口作为方法的返回类型或另一个方法的参数,而不是在实例化后立即调用说话方法。

例如,以下代码可能对接口使用有意义:

public IList<IAnimal> GetAnimals()
{
    var animals = new List<IAnimal>();
    foreach(var animal in db.Animals)
    {
        animals.add( // instantiate new animal here)
    }
    return animals;
}

这将允许调用者让所有的动物说话,不管它们的潜在类型如何。当然,如果界面只有一个说话方法,它可能不是很有用。

胡元忠
2023-03-14

不,这不是典型的方式,基本上你会有一个方法来获取接口的一个实例,然后你可以在那里调用Speak方法。你不必关心你传递的对象是什么具体类型,它的美妙之处在于你可以及时添加更多类型,而不必更改你的实现。

比如:

public void Speak(IAnimal animal)
{
    animal.Speak();
}
蒋培
2023-03-14

如果您知道对象实现了IAnim,则不需要关心对象的类型。

var animal = (IAnimal)animals[i];
animal.Speak();

检查参考资料,其中包括样品。

 类似资料:
  • 问题内容: 我有一个定义方法的接口。我有一个 实现 此接口的结构。在其中,我已经从该接口实现了方法,并且还定义了其他方法。 例如: 在操场上:https : //play.golang.org/p/B1GgoNToNl_l 在此,WagTail()不是Animal接口的一部分,但属于Dog结构。运行此代码会出现错误 dog.WagTail未定义(动物类型没有字段或方法WagTail)。 有没有一种

  • Override Method可以实现接口方法也可以覆写父类的方法,但Implement Methods只能实现接口方法 操作步骤: 菜单栏: Code —> Implement Methods 快捷键: Mac: control + L Windows\/Linux: Ctrl + I

  • 问题内容: 指示方法声明旨在覆盖超类中的方法声明。如果使用此注释类型对方法进行注释但未覆盖超类方法,则要求编译器生成错误消息。 我认为接口从技术上讲不是超类。还是? Question Elaboration 问题答案: 你应该尽可能使用@Override。它可以防止犯下简单的错误。例: 由于无法正确覆盖,因此无法编译。 实现接口(仅限1.6及更高版本)或重写Super类的方法的方法也是如此。

  • 编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?

  • 我有一个生产者,它获取数据A,产生数据B,并将其发送出去 为了证明我的问题,想象一下我有像上面这样的制作人。一个加载所有数据,然后在完成后立即批量发送,第二个立即发送数据(因此它不批量发送数据,但每当有新数据时,createdit立即发送) 大多数生产者会在每加载一个数据之后发送数据,但很少有人会马上发送。如果生产者立即发送数据,则方法将保持为空。然而,这似乎是一种糟糕的做法,可能违反了一些OOP

  • 良好软件工程的一个基本原则是将接口与实现方法分离,这样可以更容易修改程序。就类的客户而言,类实现方法的改变并不影响客户,只要类的接口保持不变即可(类的功能可能扩展到原接口以外)。 软件工程视点 6.10 将类声明放在使用该类的任何客户的头文件中,这就形成类的Public接口(并向客户提供调用类成员函数所需的函数原型)。将类成员函数的定义放在源文件中,这就形成类的实现方法。 软件工程视点 6.11