2009-10-01 8 views
1

병렬 클래스 계층 구조와 함께 제네릭을 사용할 때 몇 가지 문제가 있습니다. 나는이 혼란을 이미 여러 번 코딩했다.일반 및 병렬 클래스 계층

의 내가 다음 클래스 계층 구조 있다고 가정 해 봅시다 : -> 서브 클래스 SqlTableColumn, OracleTableColumn 표 -> SQLTable의, OracleTable 데이터베이스를 서브 클래스 - TableColumn의>를 subsclasses SqlDatabase, OracleDatabase

나는 기본 유형에 제네릭을 사용하는 제공 :

Table<TableColumn> 
Database<Table<TableColumn>> 

SqlTable<SqlTableColumn> 
SqlDatabase<SqlTable<SqlTableColumn>> 

OracleTable<OracleTableColumn> 
OracleDatabase<OracleTable<OracleTableColumn>> 

제네릭을 사용하지 않는 느낌이 들었습니다. 더 나은 디자인은 무엇일까요?

+0

어떤 프로그래밍 언어를 (내가 Java 또는 C# 추측)? – Jesper

답변

1

제네릭 (Java 또는 C#에서와 같이)은을 매개 변수화 유형으로 지원하기위한 것입니다. 이 경우 전달하는 형식 (TableColumn, SqlTableColumn)은 실제로 형식 매개 변수가 아닙니다.

매개 변수화 된 유형이 아닌 병렬 객체 계층 구조로이 유형 세트를 구현합니다. 예를 들어 : 예를 들어, JDBC에서 수행되는 모든 이러한 유형에

OracleTable extends Table 
SqlTable extends Table 

OracleDatabase extends Database 
SqlDatabase extends Database 

OracleTableColumn extends TableColumn 
SqlTableColumn extends TableColumn 

공공 방법은 기본 클래스에만 참조해야합니다.

2

(C#에서)이 나에게 더 자연스러운 것, 그것들을 사용하는 경우에 제네릭 뒤에 어떤 이론 물건을 무시 :

class Database<T, C> 
    where T : Table<C> 
    where C : TableColumn { } 
class Table<C> 
    where C : TableColumn { } 
class TableColumn { } 

//sql 
class SqlDatabase : Database<SqlTable, SqlColumn> { } 
class SqlTable : Table<SqlColumn> { } 
class SqlColumn : TableColumn { } 

//oracle 
class OracleDatabase : Database<OracleTable, OracleColumn> { } 
class OracleTable : Table<OracleColumn> { } 
class OracleColumn : TableColumn { }