2013-06-26 5 views
2

Asp.net C#을 처음 사용했습니다. 나는 물체와 상속에 관한 질문을 가지고있다. 2 개의 하위 클래스 (신용 카드 테이블, 은행 계좌 테이블)가있는 상위 클래스 (기본 테이블)가 있으면 재미 있습니다. 다른 클래스에서 기본 테이블 클래스의 객체를 가져옵니다. 제 문제는 제가베이스 테이블이 신용 카드인지 은행 계좌인지 알고 싶습니다.Asp.Net C# 개체 관련 질문

class BaseTable 
{ 
    string date; 
    public string Date 
    { 
     get { return date; } 
     set { date = value; } 
    } 

    string description; 
    public string Description 
    { 
     get { return description; } 
     set { description = value; } 
    } 

} 



class CreditCardTable:BaseTable 
{ 
    string Amount; 
    public string amount 
    { 
     get { return Amount; } 
     set { Amount = value; } 
    } 

    string Type; 
    public string type 
    { 
     get { return Type; } 
     set { Type = value; } 
    } 

} 



class BankAccountTable:BaseTable 
{ 
    string Refr; 

    public string Ref 
    { 
     get { return Refr; } 
     set { Refr = value; } 
    } 
    string debit; 

    public string Debit 
    { 
     get { return debit; } 
     set { debit = value; } 
    } 

    string credit; 

    public string Credit 
    { 
     get { return credit; } 
     set { credit = value; } 
    } 

} 
+1

더 자주 이상과 같이하지 뭔가 설계 오류의 표시입니다. 어쩌면'BaseTable'은'추상적'이어야합니까? 어쩌면 다른 코드는 기본 인스턴스가 아닌 자식 인스턴스를 필요로합니까? 인스턴스의 유형을 알아야하는 구체적인 이유는 무엇입니까? – David

+1

왜'BaseTable '이 어떤 종류인지 알아야합니까? 일반적으로 이것은 설계에 잘못되었다는 것을 의미합니다. 이것에 접근하는 일반적인 방법은 파생 클래스에서 오버라이드 된'BaseTable'에 가상/추상 메소드를 작성하여 유형별 비헤이비어를 구현하는 것입니다. 그렇게하면 BaseTable 참조를 사용하는 모든 것이 가상 메소드를 호출하고 'BaseTable' 참조의 실제 유형에 따라 다른 동작을 얻을 수 있습니다. – spender

+0

pdf를 창조하는 그것의 부호 거기 pdf 신용 카드 pdf의 2 가지의 유형이 있고 사업에서 나는 obj가 신용 카드 또는 은행 구좌인지 검사하고 싶다 그래서 나는 어느 것 창조 할 것을 선택할 수 있는지 – user2401745

답변

2

3 옵션 :

  1. 사용 is, as 또는 GetType() 명시 적으로, 당신이 부여 된 인스턴스의 유형을 확인하는 몇 가지 알려진 종류에 대해 그것을 테스트하는

    if(obj is CreditCardTable) {...} else ... 
    
  2. 기본 유형에 virtual 또는 abstract 메소드를 추가하고 inst 모든 파생 된 형식이 다른 값을 반환 BaseTable에 아마도 virtual 열거 속성 - 지금

    obj.SomeMethod(); 
    
  3. 판별 자 추가 (자동 가장 파생 override가 호출 때문에)이 인에 대해 걱정할 필요의 EAD 그 판별부터, 그리고 switch :

    switch(obj.Type) { ... } 
    
+0

두번째! !!!! 유형을 전환하면 (효과적으로 옵션 1과 3) 설계 문제가 있음을 알 수 있습니다. – spender

+0

@spender는 시나리오에 따라 다릅니다. 그것은 나의 선호도일지도 모르지만 어떤 경우에는 분리의 유형은 유형 자체가 "무엇이든"을 알지 않아야한다는 것을 의미합니다. 예를 들어 엔티티가 POCO이고 "무엇이든지"가 "ORM을 유지"하는 경우, 나는'.GetType() '을 사용하여 ORM을 받아들이고 그것을 예상 된 타입과 비교합니다; POCO가 지속되는 것은 아닙니다. serializer와 마찬가지로; 그래서 "1 번"은 확실히 유용합니다. –