Возможно, вы захотите расширить объект FirebaseUser
и добавить еще немного информации в класс. Если вы хотите сохранить тот же объект в Firebase, вам нужно создать новую ветку (например, Users
) в Firebase и сохранить объект User
.
Пожалуйста, отметьте это , если вы хотите получить более подробную информацию об этом.
Довольно распространено предоставить обоим, так, чтобы Вы закончили с:
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.
Вы не хотите вызывать использование определенных частных полей или методов. В целом Вы не заботитесь о реализации, Вы заботитесь об интерфейсе. Поэтому определите несколько методов в нескольких интерфейсах (в зависимости от того, в каком количестве Вы нуждаетесь), и определите классы, которые реализуют их. Это, вероятно, причинит Вам боль меньше всего в будущем.
Частные поля и методы не могут использоваться подклассами (кроме того, если они - также внутренние классы). Вы могли сделать их защищенными, как бы то ни было.
Интерфейс определяет просто что - интерфейс (контракт) с миром вне класса с реализацией. Открытые методы (краткий обзор или не) суперкласс делают то же. Вы не должны пытаться потребовать, чтобы подклассы имели определенных членов парламента, не занимающих официального поста - Вы пытаетесь указать реализацию, которая является тем, какое ООП - все о предотвращении.
Вы используете абстрактный класс, когда Вы хотите определить некоторое общее поведение в суперклассе - но тот класс не может выдержать самостоятельно (это должно быть разделено на подклассы). Может случиться так, что общему поведению нужно некоторое собственное состояние - в этом случае это может определить частные поля, и это может также иметь закрытые методы, которые только это может использовать.
Даже если Вы наследуетесь абстрактному классу, то Вы не сможете получить доступ к его частным полям/методам.
Правильно. Интерфейсы для всеобщего использования. И частная реализация должна быть в кратком обзоре (или бетон) классом.
Если Вы когда-нибудь предполагаете, какой выбрать, который я, предлагают допустить ошибку на стороне Интерфейсов - лучше иметь интерфейс, который должен был быть абстрактным классом, чем наоборот.
Интерфейсы определяют контракт для поведения. Это - то, чем они должны быть о, не атрибуты.
Я хочу вынудить класс использовать конкретные частные поля (и методы)
Эта часть Вашего вопроса сомнительна: почему Вы думаете, что хотите сделать это?
члены парламента, не занимающие официального поста не видимы к подклассам, и интерфейсы определяют открытый интерфейс, таким образом, Ваш единственный выбор состоял бы в том, чтобы использовать абстрактный класс..., но я не могу думать ни о какой причине, почему любой когда-либо хотел бы сделать это
Это корректно. Но это - не обязательно решение неизбежного выбора, можно объединить преимущества интерфейсов и абстрактных классов путем обеспечения скелетной реализации наряду с интерфейсом. Можно найти очень интересное описание этого подхода в Эффективном Java, 2-м Ed., Объект 18 ("Предпочитают интерфейсы абстрактным классам").
Если Вы захотите, чтобы подкласс определил определенные методы, то использование интерфейса добьется цели. Как другие сказали, это не так о том, как подкласс делает это, просто то, что это сделает это.
Если вы хотите, чтобы класс использовал определенные поля или методы другого класса, вы можете объявить их защищенными.
public abstract class A {
protected Object thing;
}
может быть доступен другому классу в том же пакете (может быть расширением класса A или нет)
A a = new A();
a.thing.toString();
На самом деле это не «принуждение» другого класса к его использованию, больше похоже на «включение».