2013-06-26 47 views
2

我是新來的Asp .net C#。我有關於對象和繼承的問題。 如果我有父類(Base-Table)有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'應該是'abstract'?也許其他代碼需要一個子實例而不是基礎實例?什麼樣的具體原因你需要知道實例的類型? – David

+1

爲什麼你需要知道你的'BaseTable'是什麼類型?通常這意味着你的設計出錯了。解決這個問題的通常方法是在'BaseTable'中創建一個虛擬/抽象方法,該方法在派生類中被覆蓋以實現特定於類型的行爲。這樣,任何使用BaseTable引用的東西都可以調用虛方法並根據「BaseTable」引用的實際類型獲取不同的行爲。 – spender

+0

其創建PDF的代碼有2種類型的pdf信用卡pdf和銀行帳戶pdf所以在業務中我想檢查如果obj是信用卡或銀行賬戶,所以我可以選擇哪一個創建 – user2401745

回答

2

3個選項:

  1. 使用isasGetType()明確檢查您已獲得一個實例的類型,以測試它反對某些已知類型

    if(obj is CreditCardTable) {...} else ... 
    
  2. 添加一個virtualabstract方法的基本類型,並使用該inst也許virtual枚舉屬性爲BaseTable所有派生類型返回不同的值 - 的永遠不必擔心它是(因爲它會自動調用最衍生override

    obj.SomeMethod(); 
    
  3. 加鑑別EAD從和switch上鑑別:

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

第二! !!!!開啓類型(有效選項1和3)給我一個設計問題。 – spender

+0

@spender取決於場景;這也是我的偏好,但在某些情況下,分離關注意味着類型本身不應該知道這個「無論」;例如,如果實體是POCO,並且「whatever」是「ORM持久化它」,那麼我會使用'.GetType()'接受ORM並將其與預期類型進行比較; POCO的工作不是堅持下去。與串行器一樣;所以「第一」肯定有一定的效用 –