2011-03-24 70 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接口。