为什么要使用接口,多inheritance与接口,接口的好处?
我仍然对这件事有些困惑。 我到现在为止发现的是
(类似的问题已经在这里被问到,但我还有其他一些观点。)
接口是唯一抽象方法和最终字段的集合。
Java中没有多重inheritance。
接口可以用来在Java中实现多重inheritance。
inheritance的一个优点是我们可以在派生类中使用基类的代码,而不需要再次编写它。 可能这是inheritance的最重要的事情在那里。
现在..
Q1。 由于接口只有抽象方法(无代码),所以我们怎么说如果我们正在实现任何接口,那么它是inheritance? 我们没有使用它的代码。
Q2。 如果实现一个接口不是inheritance,那么如何使用接口来实现多inheritance?
Q3。 无论如何,使用接口有什么好处? 他们没有任何代码。 我们需要在我们实现它的所有类中一遍又一遍地编写代码。
那为什么要做接口?
注意:我发现了一个界面有帮助的例子。 其中一个例子就像在Runnable接口中我们有public void run()方法,在这个方法中我们定义了线程的function,并且在编码中内置了这个方法将作为一个单独的线程来运行。 所以我们只需要编码在线程中做什么,Rest是预定义的。 但是这个东西也可以用抽象类来实现。
那么使用接口有什么好处呢? 我们使用接口实现的是多重inheritance吗?
Q1。 由于接口只有抽象方法(无代码),所以我们怎么说如果我们正在实现任何接口,那么它是inheritance? 我们没有使用它的代码。
我们不能。 接口不用于实现多重inheritance。 他们用更安全的替代它,尽pipe稍微不那么强大的构造。 注意关键字implements
而不是extends
。
Q2。 如果实现一个接口不是inheritance,那么如何使用接口来实现多inheritance?
他们不是。 通过接口,一个类可以有多个“ 视图 ”,不同的API或function。 例如,一个类可以同时运行和Callable
,而这两种方法实际上是在做相同的事情。
Q3。 无论如何,使用接口有什么好处? 他们没有任何代码。 我们需要在我们实现的所有类中一遍又一遍地编写代码。
接口是多种inheritance,没有后者引入的问题 (如钻石问题 )。
接口的用例很less:
-
对象有效地有两个身份:
Tank
既是Vehicle
又是Weapon
。 你可以使用前者或后者的Tank
实例(多态)。 这在现实生活中很less出现,实际上是多重inheritance更好(或特性)的有效例子。 -
简单的责任:游戏中的
Tank
对象的实例也是可运行的,让你在一个线程和一个ActionListener
执行它来响应鼠标事件。 -
callback接口:如果对象实现给定的callback接口,则会通知其生命周期或其他事件。
-
标记接口:不添加任何方法,但可以通过
instanceof
轻松访问,以发现对象的function或愿望。Serializable
和可Cloneable
就是这样的例子。
你正在寻找的是特质(如在斯卡拉),不幸的是在Java中不可用。
接口是最终静态字段和抽象方法的集合(新增了Java 8在接口中增加了对静态方法的支持)。
当我们知道必须完成一些任务的时候,接口就是在这种情况下做出来的,但是如何完成这个任务可能会有所不同。 换句话说,我们可以说我们实现接口,使我们的课程开始以一种特定的方式行事。
让我以一个例子来解释,我们都知道动物是什么。 像狮子是动物,猴子是动物,大象是动物,牛是动物等等。 现在我们知道所有的动物都会吃东西和睡觉。 但每只动物可以吃东西或睡觉的方式可能不同。 像狮子一样吃牛吃草。 但都吃了。 所以我们可以有这样的伪代码,
interface Animal { public void eat(); public void sleep(); } class Lion implements Animal { public void eat() { // Lion's way to eat } public void sleep(){ // Lion's way to sleep } } class Monkey implements Animal { public void eat() { // Monkey's way to eat } public void sleep() { // Monkey's way to sleep } }
按照上面提到的伪代码,任何能够进食或睡觉的东西都会被称为动物,或者我们可以说所有的动物都必须吃东西和睡觉,但是吃东西和睡觉的方式取决于动物。
在接口的情况下,我们只inheritance行为,而不是类inheritance的实际代码。
Q1。 由于接口只有抽象方法(无代码),所以我们怎么说如果我们正在实现任何接口,那么它是inheritance? 我们没有使用它的代码。
实现接口是其他types的inheritance。 它与类的inheritance不相似,因为inheritance子类从基类获得真正的代码重用。
Q2。 如果实现一个接口不是inheritance,那么如何使用接口来实现多inheritance?
据说因为一个类可以实现多个接口。 但是我们需要明白,这种inheritance不同于类的inheritance。
Q3。 无论如何,使用接口有什么好处? 他们没有任何代码。 我们需要在我们实现的所有类中一遍又一遍地编写代码。
实现一个接口会强制类必须重写它的所有抽象方法。
在这里和这里阅读我的书
吻
我已经search了几天,试图了解接口,似乎读了相同的通用帮助; 我不想贬低这些贡献,但是我认为灯泡只是点击了,所以我很好奇:))
我更喜欢保持简单的愚蠢,所以将提供我的新发现的接口视图。
我是一个偶然的编码器,但我想发布这个代码,我写在VB.NET(原则是相同的其他语言),以帮助他人理解接口。
如果我错了,请在后续的评论中告诉别人。
说明
单击一个窗体上的三个button,可以保存对接口variables(_data)的不同的类引用。 不同的类引用到一个接口variables的整个点,是我不明白,因为它似乎是多余的,然后它的力量变得明显与msgbox,我只需要调用SAME方法来执行我所需要的任务,在这'GetData()',它使用当前由接口引用variables(_data)保存的类中的方法。
所以,不pipe怎样,我希望从数据库,网页或文本文件中获取数据,只能使用相同的方法名称 ; 该实现背后的代码…我不在乎。
用这个接口可以很容易地改变每个类的代码,而不需要依赖…这是OO和封装的关键目标。
何时使用
代码类,如果你注意到方法使用相同的动词,如“GetData()”,那么在这个类上实现一个接口并使用该方法名称作为抽象/接口是一个很好的select。
我真诚地希望这能帮助这个困难的原则。
Public Class Form1 Private _data As IData = Nothing Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click _data = New DataText() MsgBox(_data.GetData()) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click _data = New DataDB() MsgBox(_data.GetData()) End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click _data = New DataWeb() MsgBox(_data.GetData()) End Sub End Class Public Interface IData Function GetData() As String End Interface Friend Class DataText : Implements IData Friend Function GetData() As String Implements IData.GetData Return "DataText" End Function End Class Friend Class DataDB : Implements IData Friend Function GetData() As String Implements IData.GetData Return "DataDB" End Function End Class Friend Class DataWeb : Implements IData Friend Function GetData() As String Implements IData.GetData Return "DataWeb" End Function End Class
-
虽然“接口实现”(而不是“混凝土inheritance”)是更好的IMO,但是“inheritance”这个词仍然经常被使用。 简单的“inheritance”应该保留用于具体的inheritance(扩展)。
-
通过在类上实现多个接口,然后实现所有接口所需的所有方法,属性和事件,可以获得多inheritance的“效果”。 使用具体类来做这件事的一种常见方法是通过与类的“has-a”(组合)关系,通过将实现“连线”到每个内部类实现来实现外部接口。 像C ++这样的语言直接支持多个具体的inheritance。
-
接口允许现有的类(如框架)与新的类进行交互,而不需要在之前“看过”它们,因为能够与已知的接口进行通信。 将界面视为合同。 通过在一个类上实现这个接口,你在合约上必然要履行它所要求的义务。
一个“真实的世界”的例子就是一个电源sockets – 它提供了一个通用的接口(线路,中性点和接地)和一个开/关开关,还有一些“理解”的约定,如电压,频率和最大电stream。 但是,即使该设备在devise界面时不存在,也可以在明年发明一个风扇,水壶或一些新设备。
接口对于类的松耦合(见SOLID的依赖反转原理和接口分离原理 )非常有用,并广泛用于unit testing和dependency injection的目的。
这是一个非常古老的问题,java-8版本增加了更多的function和接口。
一个接口声明可以包含
- 方法签名
- 默认方法
- 静态方法
- 常数定义。
在接口中实现的唯一方法是默认方法和静态方法。
界面的使用:
- 定义合同
- 链接不相关的类有一个function (例如,实现Serializable接口的类除了实现该接口之外,它们之间可能有也可能没有任何关系
- 提供可互换的实现,例如
Strategy_pattern
- 默认方法使您可以向库的接口添加新function,并确保与为这些接口的旧版本编写的代码的二进制兼容性
- 使用静态方法在库中组织帮助器方法(可以在同一个接口中保留特定于接口的静态方法,而不是在单独的类中)
更好地理解这些概念来看看这个相关的SE问题代码实例:
我应该如何解释一个接口和一个抽象类的区别?
回到你的问题:
Q1。 由于接口只有抽象方法(无代码),所以我们怎么说如果我们正在实现任何接口,那么它是inheritance? 我们没有使用它的代码。
Q2。 如果实现一个接口不是inheritance,那么如何使用接口来实现多inheritance?
接口可以包含静态和默认方法的代码。 这些默认方法提供向后兼容性,静态方法提供了辅助/实用function。
在java中你不能有真正的多重inheritance,接口不是获得它的方法。 接口只能包含常量。 所以你不能inheritance状态,但你可以实现行为。
你可以用inheritance来replaceinheritance 。 接口为实现类提供了多种function。
Q3。 无论如何,使用接口有什么好处? 他们没有任何代码。 我们需要在我们实现它的所有类中重复编写代码。
请参阅我的答案中的“ 接口的使用 ”部分。
inheritance是当一个类派生自另一个类(可以是抽象的)或一个接口。 面向对象(inheritance)的最强点不是代码的重用(有很多方法可以做到),而是多态。
多态性是指使用接口的代码,实例对象可以是从该接口派生的任何类。 例如,我可以有这样一个方法:public void Pet(IAnimal animal),这个方法将得到一个对象,它是从IAnimalinheritance的Dog或Cat的一个实例。 或者我可以有这样的代码:IAnimal动物然后我可以调用这个接口的方法:animal.Eat()Dog或Cat可以以不同的方式实现。
接口的主要优点是可以从其中inheritance,但是如果只需要inheritance一个接口,也可以使用抽象类。 这里是一个文章,更详细地解释了抽象类和接口之间的区别: http : //www.codeproject.com/KB/cs/abstractsvsinterfaces.aspx
接口是为了让一个课程开始以特定的方式行事。 这是我会说。
接口
接口是定义如何与对象交互的契约。 它们对于expression内部人员打算如何与对象进行交互很有用。 在依赖倒置之后,你的公共API将具有用接口表示的所有参数。 你不关心它是如何做你需要做的,只是它正是你所需要做的。
例如:您可能只需要一辆Vehicle
来运输货物,您并不关心特定的运输方式。
遗产
inheritance是特定实现的扩展。 该实现可能满足或不能满足特定的接口。 只有当你关心如何的时候,你才应该期待一个特定实现的祖先。
示例:您可能需要使用Plane
执行快速运输。
组成
组合可以用作inheritance的替代。 而不是你的类扩展一个基类,它是用实现主类责任的较小部分的对象来创build的。 构图用于facade pattern
和decorator pattern
。
示例:您可以创build一个实现LandVehicle
和WaterVehicle
的DuckBoat
( DUKW )类,这两个类都实现由Truck
和Boat
实现组成的Vehicle
。
答案
Q1。 由于接口只有抽象方法(无代码),所以我们怎么能说如果我们正在实现任何接口,那么它是inheritance? 我们没有使用它的代码。
接口不是inheritance。
Q2。 如果实现一个接口不是inheritance,那么如何使用接口来实现多inheritance?
接口不能实现多重inheritance。 他们表示,一个class可能适合多个angular色。
Q3。 无论如何,使用接口有什么好处? 他们没有任何代码。 我们需要在我们实现的所有类中一遍又一遍地编写代码。
接口的一个主要优点是提供关注的分离:
- 你可以编写一个类来处理另一个类,而不必关心这个类是如何实现的。
- 任何未来的开发都可以与您的实现兼容,而无需扩展特定的基类。
本着DRY
的精神,你可以编写一个满足接口的实现,并且如果你利用合成,仍然要考虑open/closed principal
。