2014-11-19 4 views
0

나는 추상 클래스의 체인을 상속하는 일련의 비즈니스 로직 클래스를 보유하고 있습니다. 또한 추상적 인 클래스의 체인에서 상속받은 일련의 비즈니스 데이터 클래스가 있습니다. 두 경우 모두 내 파생 클래스 (C)는 추상 클래스 (A)에서 상속받은 추상 클래스 (B)를 상속합니다. (따라서 C : B와 B : A ...이 규칙은 내 프로그램에서 사용 된 이름이 아니라 문제를 보여주기위한 것임을 유의하십시오.파생 클래스 속성 멤버에 액세스

격리되어있어, 논리 클래스 체인이 예상대로 작동합니다. 메서드 호출은 올바른 기본 또는 재정의 된 구현을 사용합니다. 내 데이터 클래스에도 동일하게 적용됩니다 (올바른 필드에 새 필드/속성이 나타남).

제 문제는 데이터 클래스를 논리 클래스의 속성으로 추가하려고합니다. 기본 추상 논리 클래스 (A)는 기본 추상 데이터 클래스 (다시, A)의 일부 필드를 호출 할 수 있어야합니다. 그러나 체인 (B)의 다음 추상 논리 클래스는 체인 (B)의 다음 레벨에서 일부 필드/특성을 사용해야합니다. 파생 콘크리트 유형 (C)과 동일합니다.

처음에는 "A"논리 클래스에 기본 추상 데이터 클래스의 속성을 추가하면이 속성을 체인 위쪽으로 사용할 수 있다고 가정했습니다 (예 : "B"논리 클래스에서 사용할 수 있음). this.Data.Variable "Variable"필드에 액세스하여 "B"데이터 클래스에 "Variable"필드가 구현됩니다. 캐스트 없이는 전체 논리 클래스 체인에서 기본 추상 데이터 클래스에 노출 된 필드를 사용하는 것으로 제한됩니다.

나는이 사이트에서 좋은 조언을 발견했으며 제네릭 사용 경로를 따라 갔다. 데이터 클래스의 필드를 사용할 때 기본 논리 클래스에서 캐스트를 수행해야합니다 (파생 클래스에서 필드를 사용할 때 캐스트 할 필요는 없습니다).

내 수업의 샘플은 아래를 참조하십시오. 나는 기본 논리 클래스 (LogicA)에 MethodA를 구현하여 필드를 사용하기 위해 올바른 데이터 유형으로 변환해야하는 위치를 보여줍니다.

abstract class LogicA<T> 
{ 
    public T Data { get; set; } 

    public virtual void MethodA() 
    { 
     var data = (DataA)((dynamic)this.Data); 
     data.FieldA = "T"; 
    } 
} 


abstract class LogicB<T> : LogicA<T> 
{ 
    public virtual void MethodB() 
    { 

    } 
} 

class LogicC : LogicB<DataC> 
{ 
    public void MethodC() 
    { 
     this.Data.FieldB = "BBB"; 
    } 
} 

abstract class DataA 
{ 
    public string FieldA { get; set; } 
} 

abstract class DataB : DataA 
{ 
    public string FieldB { get; set; } 
} 

class DataC : DataB 
{ 
    public string FieldC { get; set; } 
} 

논리 클래스를 사용하여, 나는 어떤 문제없이 다음을 수행 할 수 있습니다

 LogicC logic = new LogicC(); 
     logic.Data = new DataC(); 
     logic.Data.FieldA = "A"; 
     logic.Data.FieldB = "B"; 
     logic.Data.FieldC = "C"; 
     logic.MethodA(); 

나의 현재 관심사는 ... 기본적으로 내가하려고 무엇을 해낼 수있는 더 좋은 방법이 이루다? 데이터 필드를 사용할 때 추상 논리 클래스를 통한 형 변환과 함께이 접근법이 지루하다는 것을 알 수 있습니다.

답변

0

그냥 논리 클래스에 대한 제한을 지정하여 계층은 아닌, 다른 클래스에

abstract class LogicA<T> 
    where T: DataA 
{ 
    public T Data { get; set; } 

    public virtual void MethodA() 
    { 
     var data = (DataA)((dynamic)this.Data); 
     data.FieldA = "T"; 
    } 
} 

를 사용하여 동일한 방법을.

+0

감사합니다. 정확히 내가 필요한 것. – camelCase

관련 문제