2011-01-04 3 views
1

이것은 간단 할 수도 있지만 내 머리를 감싸는 것을 거부하기 때문에 외부보기가 항상 유용합니다!일반 구조를 사용하는 C# 클래스 디자인

환자를위한 매개 변수 등록을 구현하려면 개체 계층 구조를 설계해야합니다. 이것은 특정 날짜에 발생하며 환자 (혈압, 심장 박동수 등)에 대한 다양한 매개 변수를 수집합니다. 매개 변수 등록의 값은 문자열, 정수, 부동 소수점 또는 지침 (조회 목록 용)과 같은 다른 유형이 될 수 있습니다.

그래서 우리가 가진 :

public class ParameterRegistration 
{ 
    public DateTime RegistrationDate { get; set; } 
    public IList<ParameterRegistrationValue> ParameterRegistrationValues { get; set; } 
} 

public class ParameterRegistrationValue 
{ 
    public Parameter Parameter { get; set; } 
    public RegistrationValue RegistrationValue { get; set; } // this needs to accomodate the different possible types of registrations! 
} 


public class Parameter 
    { 
    // some general information about Parameters 
    } 

public class RegistrationValue<T> 
{ 
    public RegistrationValue(T value) 
    { 
    Value = value; 
    } 

    public T Value { get; private set; } 
} 

UPDATE : 감사는 제안에, 모델은 지금으로 변신 한 다음

참으로 조금 더 간단
public class ParameterRegistration 
{ 
    public DateTime RegistrationDate { get; set; } 
    public IList<ParameterRegistrationValue> ParameterRegistrationValues { get; set; } 
} 

public abstract class ParameterRegistrationValue() 
{ 
    public static ParameterRegistrationValue CreateParameterRegistrationValue(ParameterType type) 
{ 
    switch(type) 
    { 
     case ParameterType.Integer: 
      return new ParameterRegistrationValue<Int32>(); 
     case ParameterType.String: 
       return new ParameterRegistrationValue<String>(); 
     case ParameterType.Guid: 
      return new ParameterRegistrationValue<Guid>(); 
     default: throw new ArgumentOutOfRangeException("Invalid ParameterType: " + type); 
    } 
} 
    public Parameter Parameter { get; set; } 
} 

public class ParameterRegistrationValue<T> : ParameterRegistrationValue 
{ 
    public T RegistrationValue {get; set; } 
} 

public enum ParameterType 
{ 
    Integer, 
    Guid, 
    String 
} 

public class Parameter 
{ 
    public string ParameterName { get; set; } 
    public ParameterType ParameterType { get; set;} 
} 

하지만, 이제 ParameterRegistration의 IList가 을 가리키고 있기 때문에 궁금합니다. ParameterRegistrationValue 객체는 어떻게 얻을 수 있습니까? 실제 값은 (하위 오브젝트에 저장되어 있기 때문에)?

아마 전체 일반적인 것은 참으로 결국 갈 아주 방법이 아니다 : s는

+0

그리고 무엇이 공개적인 fied를 사용하고 있습니까? –

+0

문제가 무엇인지 언급하지 않았습니다. –

+0

여기에 당신이 누락 된 것은 무엇입니까? 작동하지 않습니까? 어디에서/어떻게 실패합니까? –

답변

4

(이 RegistrationValue의 형식 매개 변수에 의존하지 않기 때문에), I는 제네릭이 아닌 기본 클래스에 Parameter를 이동할 것 매개 변수의 최종 집합과 각 매개 변수의 해당 유형을 알고 있으면 제네릭이 도움이되지 않을 것입니다. 개체을 매개 변수 값 유형으로 사용하십시오.

매개 변수 목록을 반복하면 값 처리 방법을 결정하기 위해 각 항목의 유형을 검사해야하기 때문에 매개 변수 목록을 반복하는 것은 매우 어려울 것입니다.

제네릭을 사용하여 달성하려는 목표는 무엇입니까?예, 멋지다. (복싱/언 박싱은 아마도 좋은 생각이 아니다.) 그러나 경우에 따라 오브젝트 (단순성과 유연성 모두를 위해)을 사용하는 것이 좋습니다.

- 파벨

+0

나는 각 매개 변수의 유형을 입력하면이 정보가 데이터베이스에 저장되므로 검색 할 수 있습니다. – Sam

+0

좋아요,이 경우 제네릭 형식을 컬렉션 형식 (매개 변수 목록)으로 사용하고 팩토리 패턴을 실제 매개 변수 값을 기반으로 특정 매개 변수 값 형식을 검색하는 것이 좋습니다. 그러나 아직 제네릭을 사용하는 것은 가치가 없습니다. – volpav

+0

더 많이 팅커를 쓰면할수록 당신에게 동의하기 시작합니다. 제네릭도 정확히 이상적이지 않습니다. 이 경우 구현할 구조의 예가 있습니까? 감사! – Sam

0

수있다, 당신은 T 공공 RegistrationValue RegistrationValue 사용해야합니다 - 일반적으로 사용하는 타입입니다. 예를 들어, T -는 String 또는 다른 클래스 또는 구조체입니다.

또는 RegistrationValue 필드에 generic 인수를 사용하려면 ParameterRegistrationValue 클래스를 generic으로 설정해야합니다.

2

소개하고자하는 것이 RegistrationValue<T>의 추상 기본 클래스이므로 해당 유형에 대한 지식 없이도 ParameterRegistrationValue 클래스가 비 - 일반 참조를 보유 할 수 있습니다. . 또한, 그것은 또한 ParameterRegistrationValue 제네릭 있도록하는 것이 적절할 수 있으며, ParameterRegistration에서 값 목록이 다른 유형이 될 수 있도록 다음 (대신에 대한 제네릭이 아닌 기본 클래스를 추가

첫번째 방법 :

public abstract class RegistrationValue 
{ 
} 

public class RegistrationValue<T> : RegistrationValue 
{ 
    public RegistrationValue(T value) 
    { 
    Value = value; 
    } 

    public T Value { get; private set; } 
} 

이제 코드를 컴파일해야합니다. 당신은 제네릭이 아닌 기본 클래스가 있으면


, 나는 또한에 제네릭 형식 매개 변수에 의존하지 않는 일반 클래스의 모든 멤버를 이동할 것 이 기본 클래스입니다. 예이지만, 우리가 대신 일반적인 것으로 ParameterRegistrationValue를 수정 한 경우가 그렇지 않은 경우

+0

매개 변수 등록에는 여러 가지 유형의 등록이 포함될 수 있으므로 유형이 틀림없이 필요합니다. – Sam

+0

Damien, "ParmaterRegistrationValue를 generic으로 설정하십시오."라고 말하면 RegistrationValue 대신 또는 그 외에도 의미가 있습니까? – Sam

+0

@Sam - 나는 또한 그 생각에서 그 RegistrationValue 속성이 특정 유형일 수 있다고 생각했습니다. 계층 구조가 얼마나 높은지에 따라 제네릭 형식 정보를 유지하는 것이 유용하며 어떤 수준에서 우리는 확실히 원하지 않습니다 (예 : 그러한 값의 목록을 유지하려는 경우와 다를 수 있습니다 –

0

는 당신이 각 요소에 대한 다른 유형을 가지고 서로 다른 RegistrationValue의 파생 클래스의 인스턴스의 컬렉션을 가지고 그것을 반복 할 수 있어야하고,하고 싶은 생각합니다. 그건 다소 불가능합니다.

컬렉션을 반복하면 기본 유형 (ParameterRegistrationValue-이 하나는 IList 유형 매개 변수로 지정됨)에 대한 참조가 반환되므로 여전히 각 요소를 알고있는 유형으로 캐스팅해야합니다. 따라서 non-generic object 목록을 반복하는 것보다 실제적인 차이를 만들지는 않을 것입니다.

그리고 모든 유형을 알고있는 각 매개 변수에 대해 해당 캐스팅을 안전하게 수행 할 수 있다면 이처럼 콜렉션이 필요하지 않을 것입니다. 모든 매개 변수를 캡슐화하는 클래스를 갖는 것이 더 나을 것입니다. 하나의 유형으로, IntelliSense 등으로 강력한 유형으로 호출 할 수 있습니다.

public class ParameterRegistration 
{ 
    public DateTime RegistrationDate { get; set; } 
    public PatientData PatientData { get; set; } 
    public Guid Identifier { get; set; } 
    // ... 
} 
+0

그러면 PatientData 객체에 무엇을 저장할 것입니까? 감사. – Sam

+0

글쎄, 당신의 필요를 모른다. 'Registration'에 대한 모든 데이터를 표현할 수있는 일종의 도메인 객체가 없습니까? 가능한 모든 ParameterRegistrationValue를 캡슐화합니까? 그것은 많은 양의 데이터가 될 수 있지만, 필요하다면 주어진 인스턴스에 적용 할 수없는 데이터를 'null'을 넘어서게 할 수 있습니다. – NOtherDev