이 추상 수업을 설계하는 데 가장 좋은 방법은 무엇입니까? (1 부)

StackOverflow https://stackoverflow.com/questions/1641877

  •  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의 기능을 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top