Java: Интерфейс по сравнению с Абстрактным классом (относительно полей)

Возможно, вы захотите расширить объект FirebaseUser и добавить еще немного информации в класс. Если вы хотите сохранить тот же объект в Firebase, вам нужно создать новую ветку (например, Users) в Firebase и сохранить объект User.

Пожалуйста, отметьте это , если вы хотите получить более подробную информацию об этом.

10
задан Chris 20 January 2009 в 17:13
поделиться

11 ответов

Довольно распространено предоставить обоим, так, чтобы Вы закончили с:

public interface Sendable {
    public void sendMe();
}

и

public abstract class AbstractSender implements Sendable {
    public abstract void send();

    public void sendMe() {
        send(this.toString());
    }
}

Тем путем любой, кто доволен реализацией по умолчанию в абстрактном классе, может быстро разделить его на подклассы, не переписывая много кода, но любого, кто должен сделать что-то более сложное (или кто должен наследоваться другому базовому классу), может все еще реализовать интерфейс и быть Plug and Play.

20
ответ дан 3 December 2019 в 13:22
поделиться

Вы не хотите вызывать использование определенных частных полей или методов. В целом Вы не заботитесь о реализации, Вы заботитесь об интерфейсе. Поэтому определите несколько методов в нескольких интерфейсах (в зависимости от того, в каком количестве Вы нуждаетесь), и определите классы, которые реализуют их. Это, вероятно, причинит Вам боль меньше всего в будущем.

20
ответ дан 3 December 2019 в 13:22
поделиться

Частные поля и методы не могут использоваться подклассами (кроме того, если они - также внутренние классы). Вы могли сделать их защищенными, как бы то ни было.

4
ответ дан 3 December 2019 в 13:22
поделиться

Интерфейс определяет просто что - интерфейс (контракт) с миром вне класса с реализацией. Открытые методы (краткий обзор или не) суперкласс делают то же. Вы не должны пытаться потребовать, чтобы подклассы имели определенных членов парламента, не занимающих официального поста - Вы пытаетесь указать реализацию, которая является тем, какое ООП - все о предотвращении.

Вы используете абстрактный класс, когда Вы хотите определить некоторое общее поведение в суперклассе - но тот класс не может выдержать самостоятельно (это должно быть разделено на подклассы). Может случиться так, что общему поведению нужно некоторое собственное состояние - в этом случае это может определить частные поля, и это может также иметь закрытые методы, которые только это может использовать.

Даже если Вы наследуетесь абстрактному классу, то Вы не сможете получить доступ к его частным полям/методам.

3
ответ дан 3 December 2019 в 13:22
поделиться

Правильно. Интерфейсы для всеобщего использования. И частная реализация должна быть в кратком обзоре (или бетон) классом.

1
ответ дан 3 December 2019 в 13:22
поделиться

Если Вы когда-нибудь предполагаете, какой выбрать, который я, предлагают допустить ошибку на стороне Интерфейсов - лучше иметь интерфейс, который должен был быть абстрактным классом, чем наоборот.

1
ответ дан 3 December 2019 в 13:22
поделиться

Интерфейсы определяют контракт для поведения. Это - то, чем они должны быть о, не атрибуты.

1
ответ дан 3 December 2019 в 13:22
поделиться
Я хочу вынудить класс использовать конкретные частные поля (и методы)

Эта часть Вашего вопроса сомнительна: почему Вы думаете, что хотите сделать это?

члены парламента, не занимающие официального поста не видимы к подклассам, и интерфейсы определяют открытый интерфейс, таким образом, Ваш единственный выбор состоял бы в том, чтобы использовать абстрактный класс..., но я не могу думать ни о какой причине, почему любой когда-либо хотел бы сделать это

1
ответ дан 3 December 2019 в 13:22
поделиться

Это корректно. Но это - не обязательно решение неизбежного выбора, можно объединить преимущества интерфейсов и абстрактных классов путем обеспечения скелетной реализации наряду с интерфейсом. Можно найти очень интересное описание этого подхода в Эффективном Java, 2-м Ed., Объект 18 ("Предпочитают интерфейсы абстрактным классам").

1
ответ дан 3 December 2019 в 13:22
поделиться

Если Вы захотите, чтобы подкласс определил определенные методы, то использование интерфейса добьется цели. Как другие сказали, это не так о том, как подкласс делает это, просто то, что это сделает это.

0
ответ дан 3 December 2019 в 13:22
поделиться

Если вы хотите, чтобы класс использовал определенные поля или методы другого класса, вы можете объявить их защищенными.

    public abstract class A {

      protected Object thing;
    }

может быть доступен другому классу в том же пакете (может быть расширением класса A или нет)

A a = new A();
a.thing.toString();

На самом деле это не «принуждение» другого класса к его использованию, больше похоже на «включение».

0
ответ дан 3 December 2019 в 13:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: