私は相続に関する質問があるので、私は、以下のシナリオについて説明します:私は、ログを含むテキストファイルを読んでいます継承と複数のコンストラクタ
を。 各ログ行の形式は次のとおりです。 「日付タイプの説明」
ただし、ログの「タイプ」によっては、「説明」を別に解析してさまざまな分野のアウト。ここで
は、いくつかの例は以下のとおりです。
5/1/2011 Information Field1, Field2, Field3
5/2/2011 Error Field1
- だから、私は何をしようとしたことは、このでした: "パターンに応じて、それ-parse
ログのラインアウト-get
日付タイプ説明Type "フィールド」で
-look"、および必要に応じて新しいオブジェクト/パース記述を作成
public class Log
{
public DateTime Date;
public String Type;
public String Description;
public Log(String line)
{
this.Date = GetDate();
this.Type = GetType();
this.Description = GetDescription();
}
}
public class InformationLog : Log
{
public String Field1;
public String Field2;
public String Field3;
public InformationLog(Log log)
{
this.Field1 = GetField1(log.Description);
this.Field1 = GetField2(log.Description);
this.Field1 = GetField3(log.Description);
}
}
public class Client
{
public void Main()
{
String line = ReadFileAndGetLine(); // Get a line from the file
Log log = new Log(line);
if(log.Type == "Information")
log = new InformationLog(log); // Is this right?
}
}
これは私がしたい方法で動作しますが、これは良い方法ではないようです。 "log"変数は、それ自身のコンストラクタへのパラメータとしてそれ自身を使用しています。
私の質問は これを行う標準的な方法はありますか?または、この実装に何か問題がありますか?
から
編集:
また、私が言及する必要があります:私の推論は、私は、日付と種類を出すために一度行を解析して、より細かい詳細を取得するために、再びそれを解析というものでした。
継承を使用することにしたので、DateフィールドとTypeフィールドを2回解析する必要はありません。 Factory pattern
static class LogFactory
{
public static Log Create(String line)
{
if(GetType(line) == "Information")
return CreateInformationLog(line);
return CreateLog(line);
}
private static Log CreateLog(String line)
{
return new Log(line);
}
private static Log CreateInformationLog(String line)
{
return new InformationLog(line);
}
}
を使用し、なぜ少しだけこのような何かをしない、私のコメントを1として
String line = ReadFileAndGetLine(); // Get a line from the file
Log log = LogFactory.Create(line);
条件解析を行うのに「ログ」を使用しないのはなぜですか? –
@失望:各タイプのログには異なるパラメータがあるため、「Field1、Field2、Field3など」を入れたくありませんでした。必要でない場合は「ログ」のオブジェクト – Eric
評価しましたが、常に 'Type'と' Description'を含んでいれば、これは引き続き基本クラスで発生します。 –