나는 추상 클래스의 체인을 상속하는 일련의 비즈니스 로직 클래스를 보유하고 있습니다. 또한 추상적 인 클래스의 체인에서 상속받은 일련의 비즈니스 데이터 클래스가 있습니다. 두 경우 모두 내 파생 클래스 (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();
나의 현재 관심사는 ... 기본적으로 내가하려고 무엇을 해낼 수있는 더 좋은 방법이 이루다? 데이터 필드를 사용할 때 추상 논리 클래스를 통한 형 변환과 함께이 접근법이 지루하다는 것을 알 수 있습니다.
감사합니다. 정확히 내가 필요한 것. – camelCase