我有行不同类型的动物在我的动物表在我的数据库。
我有一个带Speak方法的IAnimal接口。
我有不同的动物类来实现IAnimal接口(狗、猫等)
您是否迭代记录检查类型,然后根据类型实例化正确的对象,然后调用它们的Speak方法。
这是使用接口的典型方式吗?
如果要在关系数据库中表示派生类型,则有以下选项:
您似乎选择了选项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;
}
这将允许调用者让所有的动物说话,不管它们的潜在类型如何。当然,如果界面只有一个说话方法,它可能不是很有用。
不,这不是典型的方式,基本上你会有一个方法来获取接口的一个实例,然后你可以在那里调用Speak
方法。你不必关心你传递的对象是什么具体类型,它的美妙之处在于你可以及时添加更多类型,而不必更改你的实现。
比如:
public void Speak(IAnimal animal)
{
animal.Speak();
}
如果您知道对象实现了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