2016-03-03 6 views
-1

Я пытаюсь создать структуру модели, чтобы получить доступ к базе данных, вдохновленной Larvel's Eloquent (PHP).Доступ к свойствам из расширенного класса

В принципе, у меня есть класс под названием Model, и пока он просто пуст.

тогда я получил еще один класс с именем User, который расширяет Model

public class User extends Model { 

    private String table = "users"; 
} 

Как вы можете видеть класс пользователя также получил свойство таблицы, которая ссылается на таблицу в базе данных модель, представляющая.

Внутри моего Model.java Затем я пытаюсь получить имя таблицы.

До сих пор я запускаю некоторый код в моем конструкторе Model.java, где я просматриваю все поля на экземпляре. Это дает мне объект Field, но я не могу получить содержимое таблицы из Model.java

Model.java:

public abstract class Model { 

    public Model() 
    { 
     List<Field> fields = new ArrayList<>(); 
     for (Class<?> c = this.getClass(); c != null; c = c.getSuperclass()) { 
      fields.addAll(Arrays.asList(c.getDeclaredFields())); 
     } 
     for (Field field : fields) 
     { 
      String name = field.getName(); //returns "table" 
     } 
    } 
} 

В общем, то, что мне нужно, чтобы получить имя таблицы из класса это расширяет модель.

Любые идеи? или это плохая практика?

+1

Модель должна иметь абстрактный метод getTableName. Это плохая практика, класс никогда не должен знать подробностей о классах, которые наследуют его. –

+0

Не могли бы вы рассказать мне о том, как вы это сделаете? :) Я раньше не работал с абстрактными методами. – Jazerix

+0

Вы переопределите его конкретным методом в расширенном классе, создав простой getter для вашей частной переменной. –

ответ

2

Модель должна иметь абстрактный метод, getTableName

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

Как вы это делаете, нет контракта, который указывает, что подкласс должен реализовать это поле.

Создав метод, который должен быть реализован подклассом, существует четкий договор, и вы применяете принцип инверсии зависимостей. См. https://en.m.wikipedia.org/wiki/Dependency_inversion_principle

public abstract class Model { 

    public Model() {} 

    abstract String getTableName(); 
} 

public class User extends Model() { 
    public String getTableName(){ 
     return "users"; 
    } 
} 
+0

Я действительно понимаю, что вы говорите, но я мог бы просто создать интерфейс. Таким образом, мне пришлось бы реализовать один и тот же метод в каждом классе, что в основном делает то же самое. – Jazerix

+0

Делает то же самое? Не все ли они вернут другое имя таблицы? –

+0

Ahh, я вижу, где вы собираетесь с этим. Редактирование дало понять, спасибо :) – Jazerix

Смежные вопросы