Интерфейс не может содержать данные как класс может содержать поле. Если вы не хотите, чтобы ваш Kit
был создан, вам, скорее всего, нужен абстрактный класс. Смотрите их как интерфейс, который может иметь некоторую реализацию и поля.
Обратите внимание, пожалуйста, прочитайте для дальнейшего clarfication:Read More
Так что вы хотите в этом, чтобы иметь абстрактный класс в фоновом режиме, не интерфейс. Как это выглядит?
public abstract class Kit {
protected final String name = "Foo";
public String getName() {
return name;
}
}
Здесь у нас есть набор, каждый класс, реализующий Kit
будет иметь доступ к name
полю. Я бы рекомендовал поместить его в кепки, если он должен быть константой. Это может быть лучше всего со статическим свойством. Более того, это можно прочитать here.
Чтобы проиллюстрировать это, я сделал два класса наследовать от нашего abstract class Kit
. Ninja
и Test
.
public class Ninja extends Kit {
}
Этот класс цель просто проверить, если name
действительно имеет значение Foo
или нет.
Затем нам нужен наш фактический класс испытаний.
public class Test extends Kit {
public static void main (String[] args) {
Test ninja = new Test();
System.out.println(ninja.getName()); // foo
Ninja ninja2 = new Ninja();
System.out.println(ninja2.getName()); // foo
}
}
Они оба разных типа, Test
соответственно. Ninja
, но оба они имеют значение foo
в своем поле name
. Это будет верно для каждого класса, который наследуется от Kit
.
Если должен быть переопределен это требование, то я предлагаю, чтобы добавить constructor
из Kit
, чтобы заставить пользователя добавлять данные из базового класса.
public abstract class Kit {
protected String name;
public Kit (String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Теперь каждый класс, который наследует от Kit
должен вызывать super (String)
, означая name
поле будет установлен для каждого объекта. Он может отличаться от class A extends Kit
и class B extends Kit
. Это то, что вы искали?
Если это так, то реализация этих линий будет осуществляться с использованием class A
и class B
.
class A extends Kit {
public A (String name) {
super (name);
}
}
А для B
это будет следующим.
class B extends Kit {
public B (String name) {
super (name);
}
}
Теперь они разные классы, может содержать различные поля и методы, но они оба должны установить name
поля базового класса: Kit
.
Итак, вы хотите, чтобы все классы имели уникальное имя, но убедитесь, что все реализации имеют метод 'String getName()'? Для меня это больше похоже на случай абстрактного класса, чем на интерфейс. – Emz
@Emz Что вы подразумеваете под _implementations_? –
Когда вы делаете 'Ninja a = new Ninja(); Ninja b = new Ninja(); 'вы хотите, чтобы' a' и 'b' могли иметь разные значения? Из поля 'name ', но все же убедитесь, что у них есть поля имен? – Emz