Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Параллельное наследование / 5 сообщений из 5, страница 1 из 1
07.10.2013, 11:25:18
    #38418643
olzhas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллельное наследование
У меня есть 4 класса
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class QueryColumn {
    ...
}
public class QueryTable {
    public List<QueryColumn> columns = new LinkedList<QueryColumn>();    
    ...
}

public class PreparedQueryColumn extends QueryColumn {
    ....
}

public class PreparedQueryTable extends QueryTable{
    ...
}



По логике в PreparedQueryTable.columns могут содержаться только PreparedQueryColumn. Как это выразить в коде?

Так как сейчас никто не мешает мне сделать PreparedQueryTable.column.add(QueryColumn).
...
Рейтинг: 0 / 0
07.10.2013, 11:28:01
    #38418647
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллельное наследование
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class QueryColumn {
}
public class QueryTable<T extends QueryColumn> {
    public List<T> columns = new LinkedList<T>();    
}

public class PreparedQueryColumn extends QueryColumn{
}

public class PreparedQueryTable extends QueryTable<PreparedQueryColumn >{
}
...
Рейтинг: 0 / 0
07.10.2013, 11:46:15
    #38418669
olzhas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллельное наследование
Спасибо. в вашем случае есть небольшой минус. Можно создать такую конструкцию
QueryTable<PreparedQuerColumn> этого не должно быть. Я признаю, что это не указал в условиях. :)

Поэтому я сделал немного по другому.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class BaseTable<T> {
    List<T> columns = new LinkedList<T>();
}
public class QueryTable extends BaseTable<QueryColumn> {
    ...
}

public class PreparedQueryTable extends BaseTable<PreparedQueryColumn>{
    ...
}



Хотя пришлось создать лишний класс.
...
Рейтинг: 0 / 0
08.10.2013, 08:56:01
    #38419688
olzhas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллельное наследование
В продолжении темы. для QueryColumn и PreparedQueryColumn создал базовый класс BaseQueryColumn (в них тоже нужно было использовать generics). Для таблиц схема стала теперь такая.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class BaseTable<T extends BaseQueryColumn> {
    List<T> columns = new LinkedList<T>();
}
public class QueryTable extends BaseTable<QueryColumn> {
    ...
}

public class PreparedQueryTable extends BaseTable<PreparedQueryColumn>{
    ...
}



Однако у меня проблема при работе с BaseTable, не работает
Код: java
1.
2.
for (BaseQueryColumn queryColumn : baseTable.columns) {
...


ругается на то что baseTable.columns содержит Object, хотя я ему же указал что BaseTable<T extends BaseQueryColumn>. Что я делаю не так?
...
Рейтинг: 0 / 0
08.10.2013, 09:32:56
    #38419723
olzhas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллельное наследование
Разобрался.
Нужно использовать маски.

Код: java
1.
2.
for (BaseQueryColumn<?> queryColumn : baseTable.columns) {
...
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Параллельное наследование / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]