2009-03-17 4 views
2

여기는 적합한 디자인을 찾으려고하는 상황입니다.OOGenerics 디자인 고려 사항

번호의 프로필을 저장해야합니다. 프로필은 일련의 숫자입니다. int, float 또는 decimal 형식이 될 수 있습니다. 각 프로파일에는 ennumeration을 기반으로하는 ProfileDescription 필드가 있습니다.

각 프로필에는 ProfileVersion 개체 모음이 있습니다. 각 ProfileVersion 객체에는 ProfileValue 객체의 컬렉션이 있습니다. 이 ProfileValue 객체는 필요한 유형의 실제 숫자 값이 저장되는 곳입니다.

초기 디자인 아이디어는 Profile, ProfileVersion 및 ProfileValue를 일반적인 것으로 만드는 것이 었습니다. 내가 가질 수없는 여러 유형의 프로필 목록을 원할 때 문제가 발생했습니다. 대신 ArrayList를 사용할 수는 있지만 그 안에 데이터를 캐스팅해야합니다.

ProfileVersion 및 ProfileValue를 일반으로 설정 한 다음 프로필 개체에서 ProfileDescription 필드의 값에 따라 Type을 ProfileVersion에 할당 할 수는 있지만이를 수행 할 방법을 찾을 수 없습니다.

또 다른 생각은 ProfileBase 클래스를 사용하고 GenericProfileClass 또는 IntProfile, FloatProfile 및 DecimalProfile을 사용하여 서브 클래스를 작성해야했지만 실제로 각 클래스를 일반 클래스로 유지하는 것보다 이점이 없었습니다. 어쨌든 매번 서브 클래스를 캐스팅하십시오.

이 상황에 가장 적합한 설계 방법에 대한 의견을 보내 주시면 감사하겠습니다.

감사

답변

2

Grzenio의 생각은 맞습니다. 프로필 클래스의 각은 IProfile 오브젝트의 구현으로 만들 수있는 다음 컨테이너가 될 수있다 :

class ProfileList : IList<T> where T: IProfile 

은 따라서 당신이해야하는 유일한 제약은 인터페이스가 아닌 특정 유형 또는 주조 기지 수업.

에 관해서는

:

또 다른 생각이 나는 GenericProfileClass 또는 IntProfile, FloatProfile 및 DecimalProfile 중 하나와 을 하위 클래스 다음 ProfileBase 클래스를 사용한다, 그러나 이것은 정말 나에게주지 것 어쨌든 서브 클래스를 모두 캐스팅해야하므로 각 클래스가 generic 인 모든 이상의 장점이 있습니다.

이점은 실제로 클래스에 대해 만드는 추상화 수준에 따라 달라집니다. 제대로 설계된 경우 이상적으로 특정 캐스트를 알지 않고도 해당 기본 유형을 받아 들일 수있는 운영/비즈니스 논리/관리자 클래스를 가질 수 있습니다 (다시 제네릭을 통해).

1

나는 (도움이 작동하지 않는 코드를 붙여) 제대로 문제를 이해 있는지 확실하지 않습니다,하지만 난 당신이 등 인터페이스 IProfile, IProfileVersion를 만들려고하고 만들 수 있다고 생각 제네릭 클래스는 Profile<T>:IProfile 인터페이스를 상속합니다.

슬프게도 C#의 기본 숫자 형식이 없기 때문에 어쨌든 쉽지는 않을 것입니다.