2016-12-02 29 views
0

我的程序生成包含多個字段的特定消息。我需要從字符串中恢復消息,其中每個字段表示爲新行。有一個類(MailServiceContent),其中包含其他字段邏輯的主字段和其他類的邏輯(例如:SendMailServiceContent)。我想通過以下方式來恢復消息的整個過程:基礎構造函數處理字符串中的主要字段(主要字段行的數量不是常數,它可以是3或4),接下來是具體構造函數(在SendMailServiceContent的示例構造函數)處理更多行。是否有可能具體構造函數獲取帶有截斷主字段行的參數字符串數據,以便它可以處理它的一部分?或者,除了在基類中創建一個方法來處理這種情況外,還有另一種「好」方式,它將返回已處理行的數量並省略具體類的行數(這將在「更深」的繼承中產生問題)在接受等級處理之前修改基類的構造函數參數

class MailServiceContent 
{ 
    ... 
    public enum Message_Type 
    { 
     SEND_MAIL = 1, 
     RECEIVE_MAIL = 2, 
     RECEIVE_MAIL_PERIODIC = 3, 
     UNREGISTER_USER = 4, 
     RESPONSE_WITH_USER_ID = 5, 
     RESPONSE = 6 
    }; 

    public MailServiceContent(string data){ 
     //restore main part from string 
    } 

    public static MailServiceContent Create(byte[] data){ 
     string decodedData = Encoding.UTF8.GetString(data); 

     Message_Type messageType; 

     using (StringReader stringReader = new StringReader(decodedData)) 
     { 
      messageType = (Message_Type)int.Parse(stringReader.ReadLine()); 
     } 

     switch (messageType) 
     { 
      case Message_Type.SEND_MAIL: 
       return new SendMailServiceContent(decodedData); 
      case Message_Type.RECEIVE_MAIL_PERIODIC: 
       return new PeriodicReceiveMailServiceContent(decodedData); 
      case Message_Type.RESPONSE_WITH_USER_ID: 
       return new ResponseMailServiceContent(decodedData); 
      case Message_Type.RESPONSE: 
       return new ResponseWithIDMailServiceContent(decodedData); 
      default: 
       return new MailServiceContent(decodedData); 
     } 
    } 
} 

class SendMailServiceContent: MailServiceContent 
{ 
    ... 
    public SendMailServiceContent(string data):base(data){ 
     //restore further part from string 
    } 
} 
... 

回答

0

除了爲什麼要在構造函數中這樣做,是的,當然這是可能的。你只需要在你的基類中有一些邏輯,然後在繼承類中有更多的邏輯。他們將分別完成他們的工作。例如,這是一個簡單的應用程序。它以傳遞給B的列表中的4個字符串開頭。 B繼承A。因此,A將首先做一些工作:將5添加到列表中。然後B會做一些工作:將6添加到列表中。最後你會在列表中有6個項目。

class Program { 

    static void Main(string[] args) { 
     var items = new List<string> { "1", "2", "3", "4" }; 
     B b = new B(items); 
     foreach(var item in items) { 
      Console.WriteLine(item); 
     } 
     Console.Read(); 
    } 
} 

public class A { 
    public A(List<string> data) { 
     data.Add("5"); 
    } 
} 

public class B : A { 
    public B(List<string> data) : base(data) { 
     data.Add("6"); 
    } 
} 

構造函數的作用是基於你的代碼。如果您只想執行部分處理,那麼只需編寫該部分的代碼。

+0

我沒有看到任何其他的解決方案,然後在這種情況下使用構造函數。假設相反,我們有方法'Parse(string data)',它將在所有繼承級別處理來自字符串的適當的字段行,'在繼承類的Parse'方法將從基類調用'Parse'方法,知道哪些繼承類實例應該設置適當的字段。 – TheArtur

+0

好吧,我看到它只是簡單地修改基礎構造函數中的引用。 – TheArtur

+0

你問我另一個問題嗎?或者是否回答你的問題? – CodingYoshi

相關問題