이 추상 수업을 설계하는 데 가장 좋은 방법은 무엇입니까? (1 부)
-
10-07-2019 - |
문제
임차인과 고객이라는 추상 클래스가 있다고 가정 해 봅시다. 이 경우 임차인은 다중 테넌트 신청 모델 신청서의 소유자와 같습니다.
이 두 클래스 사이의 관계는 하나의 관계입니다.
public abstract class Tenant
{
protected Int32 id;
protected String name;
public Int32 ID { get; set; }
public String Name { get; set; }
public abstract bool Add();
public abstract bool Update();
public abstract bool Delete();
}
public class ApplicationTenant: Tenant
{
public ApplicationTenant() { }
public override Int64 ID
{
get { return id; }
set { id = value; }
}
public override String Name
{
get { return name; }
set { name= value; }
}
...
}
public abstract class Customer
{
protected Int32 id;
protected String name;
protected Tenant tenant;
public Int32 ID { get; set; }
public String Name { get; set; }
public Tenant Tenant { get; set; }
public abstract bool Add();
public abstract bool Update();
public abstract bool Delete();
}
public class CorporateCustomer : Customer
{
public CorporateCustomer () { }
public override Int64 ID
{
get { return id; }
set { id = value; }
}
public override String Name
{
get { return name; }
set { name= value; }
}
public override Tenant Tenant
{
get { return tenant; }
set { tenant= value; }
}
...
}
이 디자인의 문제점은 다음과 같은 경우입니다.
CorporateCustomer customer = new CorporateCustomer();
customer.Tenant.ID = xx
이 경우 임차인은 항상 공개 임차인을 참조하고 있습니다. 세트; } 실제로 내가 원하는 것은 ApplicationTenant의 추상이 아닙니다.
다른 개체와 관련이있는 경우이 클래스 고객의 추상화를 제거해야합니까? 당신의 생각은 무엇입니까?
해결책
또는 고객 수업에서 제네릭을 사용하십시오.
public abstract class Customer<TTenant> where TTenant: Tenant
{
protected Int32 id;
protected String name;
protected TTenant tenant;
public Int32 ID { get; set; }
public String Name { get; set; }
public TTenant Tenant { get; set; }
public abstract bool Add();
public abstract bool Update();
public abstract bool Delete();
}
다른 팁
임차인 추상 클래스를 얻는 대신 콘크리트 구현 응용 프로그램 속성에 액세스하고 싶습니까? 임차인이 ApplicationTenant 유형이라고 확신하는 경우, 즉 그냥 캐스팅 할 수 있습니다.
ApplicationTenant appTenant = (ApplicationTenant)customer.Tenant;
그런 다음 ApplicationTenant의 기능을 사용하십시오.
제휴하지 않습니다 StackOverflow