Я нашел много вопросов по абстрактным классам и интерфейсам, но ответил мне так: может ли абстрактный класс делать все, что может интерфейс? - PullRequest
0 голосов
/ 24 марта 2011

Я действительно сбит с толку, и я прочитал МНОЖЕСТВО вопросов по этой теме, и я не смог точно определить, что конкретно интерфейс может сделать, чего не может сделать абстрактный класс.

Есть ли что-то, что интерфейс может сделать, чего не может сделать абстрактный класс?

Я спрашиваю в контексте моего Java-класса, но не стесняйтесь удалять java-тег, если он применяется и к другим языкам (возможно, C #?).

Редактировать: Я понимаю, что абстрактный класс может делать то, что интерфейс не может, но если абстрактный класс может делать все, что может интерфейс, то в чем смысл интерфейса? Что означает «реализовать несколько интерфейсов»?

Ответы [ 4 ]

8 голосов
/ 24 марта 2011

Интерфейсы как таковые не могут делать то, что делают абстрактные классы.

Это потому, что абстрактные классы могут содержать код, а интерфейсы - нет. Но любой данный класс может иметь только один суперкласс - extends - в отличие от любого количества интерфейсов - implements, поэтому, если вы используете абстрактные классы, вы по существу рисуете себя в углу дерева наследования, потому что ваш класс может расширять только один класс.

Это ограничение не распространяется на интерфейсы, что позволяет одному классу иметь много целей в зависимости от того, сколько интерфейсов он реализует.

7 голосов
/ 24 марта 2011

Вы не можете наследовать от нескольких абстрактных классов в 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()
        {

        }
    }
2 голосов
/ 24 марта 2011

Хорошо прочитано:

Что означает «реализовать несколько интерфейсов»?

Рассмотрим:

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

Когда класс реализует Ifun, тогда:

  • Сопоставимый интерфейс накладывает общее упорядочение на объекты каждогокласс, который реализует это.Объекты, которые реализуют этот интерфейс, могут быть автоматически отсортированы по Collections.sort.
  • Интерфейс сериализации не имеет методов или полей и служит только для определения семантики возможности сериализации.

Это означает, что объект может иметь более 1 интерфейса.

1 голос
/ 24 марта 2011

Интерфейсы - это неинстанцируемые классы, которые содержат только методы, которые могут наследовать подклассы. Единственное, что могут делать интерфейсы (в java), это то, что класс может реализовывать много интерфейсов, в то время как класс может расширять только 1 абстрактный класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...