2011-03-24 34 views
0

我真的很困惑,我已經閱讀了關於這個主題的一些問題,而且我還沒有能夠明確指出一個接口可以做什麼,一個抽象類無法做到的事情。我發現很多關於抽象類和接口的問題,但回答我:抽象類可以完成一個接口可以做的所有事情嗎?

抽象類不能做什麼接口可以做什麼?

我要求我的Java類的情況下,但它是否適用於其他語言隨意刪除Java標籤(可能是C#?)。

編輯:我的理解是一個抽象類,可以做的事情的接口可以不要,但如果一個抽象類,可以做一切的接口可以做,那麼什麼是接口的意義呢? 「實現多個接口」是什麼意思?

回答

7

不能從C#中的多個抽象類繼承,但可以實現多個接口。

我想這可能適用於Java的太

編輯:

不能從多個類繼承。如果您有一個名爲Clonable的抽象類和一個稱爲Disposable的抽象類,那麼您只能繼承其中一個類,並且您不得不決定您的類應該是哪個類的子類:

例如:

public abstract class Clonable 
    { 
     public abstract void Clone(); 
    } 

    public abstract class Disposable 
    { 
     public abstract void Dispose(); 
    } 

    // MyClass cannot be Disposable too, it is not allowed by the language 

    public class MyClass : Clonable 
    { 
     override void Clone() 
     { 

     } 
    } 

請注意,這是允許您只能從一個類繼承的語言的設計決策。

如果您有接口另一方面,語言可以讓你同時實現

例如

public interface IClonable 
    { 
     void Clone(); 
    } 

    public interface IDisposable 
    { 
     void Dispose(); 
    } 

    public class MyClass : IClonable, IDisposable 
    { 
     void IClonable.Clone() 
     { 

     } 
     void IDisposable.Dispose() 
     { 

     } 
    } 
+1

+1:這也適用於java。 – 2011-03-24 00:27:55

+0

我將如何從多個類繼承?你能提供一個代碼示例嗎?你是什​​麼意思:實現多個接口? – BigOmega 2011-03-24 01:37:12

+0

我編輯了我的回覆。我只能真的給你一個在C#中的代碼示例,也許有人可以在Java中給予等效的,如果有幫助 – 2011-03-24 02:39:22

8

這樣的接口不能做抽象類所做的事情。

這是因爲抽象類可以包含代碼 - 接口不能。但是任何給定的類只能有一個超類 - extends - 與任何數量的接口相反 - implements,所以如果你使用抽象類,你基本上將自己繪製在繼承樹的一個角落,因爲你的類只能擴展一個類。

此限制不適用於接口,允許一個類有許多用途取決於它實現了多少接口。

+0

對於行「+1,所以如果你使用抽象類,你基本上將自己繪製在繼承樹的一個角落」。不錯。 :) – RPM1984 2011-03-24 00:40:59

+0

你是什麼意思,它只能擴展一個類?如果我有一個沒有代碼的抽象類,它與接口有什麼不同?也許代碼示例會有所幫助? – BigOmega 2011-03-24 01:35:46

+0

@瑞恩,他們非常接近。問題是你可以使用那個類FOR - 抽象類必須被子類化成有用的。該類只能有一個抽象類作爲祖先。 – 2011-03-24 02:31:17

1

接口是不可實例化的類,它只包含子類可以繼承的方法。接口可以做的唯一事情(在java中)是一個類可以實現多個接口,而一個類只能擴展1個抽象類。

+0

interfaces也可以用在代理中,抽象類可以'噸。這在各種框架中被廣泛使用。 – MeBigFatGuy 2011-03-24 00:39:54

+0

你不能實例化一個抽象類嗎? – BigOmega 2011-03-24 01:38:32

+0

您不能@Ryan,但您可以在抽象類中聲明構造函數,但從不在接口中聲明。 – 2011-03-24 08:49:25

2

博學多聞:

什麼是 「實現多個接口」 是什麼意思?

考慮:

public static interface Ifun extends Comparable<Ifun>, Serializable {}//or 
public static class Cfun2 implements Comparable<Cfun>, Serializable 

當類實現Ifun,則:

  • 可比接口強行對實現它的每個類的對象進行整體排序。實現此接口的對象可以通過Collections.sort自動排序。
  • 序列化接口沒有方法或字段,僅用於標識可序列化的語義。

這意味着對象可以有多個1接口。