我在抽象类和接口上发现了很多问题,但我回答这个问题:抽象类可以做一切接口吗?

Met*_*uru 0 java abstract-class interface

我真的很困惑,而且我已经阅读了很多关于这个主题的问题,而且我无法明确指出一个接口可以做抽象类无法做到的事情.

接口可以做什么,抽象类不能做?

我问我的Java类的情况下,但它是否适用于其他语言随意删除Java标签(可能是C#?).

编辑:我知道抽象类可以做界面不能做的事情,但是如果抽象类可以完成界面可以做的所有事情,那么界面的重点是什么?"实现多个接口"是什么意思?

Tho*_*sen 8

这样的接口不能做抽象类所做的事情.

这是因为抽象类可以包含代码 - 接口不能.但是任何给定的类只能有一个超类 - extends而不是任意数量的接口 - implements所以如果你使用抽象类,你基本上把自己画在继承树的一角,因为你的类只能扩展一个类.

此限制不适用于接口,允许单个类具有多种用途,具体取决于它实现的接口数量.


Mar*_*oth 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()
        {

        }
    }
Run Code Online (Sandbox Code Playgroud)

请注意,这是一种语言的设计决策,只允许您从一个类继承.

另一方面,如果您有接口,则该语言允许您实现这两种接口

例如

    public interface IClonable
    {
        void Clone();
    }

    public interface IDisposable
    {
        void Dispose();
    }

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

        }
        void IDisposable.Dispose()
        {

        }
    }
Run Code Online (Sandbox Code Playgroud)