У меня есть проблема, к которой я не знаю, как подступиться, и я надеюсь, что люди здесь дадут несколько хороших советов.
Я разбираю текстовые файлы, которые содержат несколько логов (по одному логу в строке). Формат примерно следующий:
Date Type Description
10/20 A LogTypeADescription
10/20 B LogTypeBDescription
10/20 C LogTypeCDescription
Здесь вы можете увидеть три «типа» журналов (A, B и C). В зависимости от того, какого типа журнал, я буду разбирать поле «Описание» по-разному.
Мой вопрос: как мне настроить структуру данных? Я хотел бы сделать что-то вроде этого:
class Log
{
DateTime Date;
String Type;
String Description;
public Log(String line)
{
Parse(line);
}
}
class ALog : Log { }
class BLog : Log { }
class CLog : Log { }
Теперь каждый производный класс может иметь свои собственные уникальные свойства в зависимости от того, как анализируется поле «Описание», и они по-прежнему будут поддерживать три «основных» свойства (дата, тип и описание).
Пока все хорошо, за исключением того, что я не знаю, какой тип (производного) журнала мне нужен, пока не проанализирую строку из файла журнала. Конечно, я мог бы разобрать строку, а потом разобраться, но я действительно хочу, чтобы код разбора был в конструкторе "Журнал". Я хотел бы сделать что-то вроде этого:
void Parse(String line)
{
String[] pieces = line.Split(' ');
this.Date = DateTime.Parse(pieces[0]);
this.Type = pieces[1];
this.Description = pieces[2];
if(this.Type == "A")
this = new ALog();
else if(this.Type == "B")
this = new BLog();
else if(this.Type == "C")
this = new CLog();
}
Но, к сожалению, я не думаю, что это возможно. Я еще не пробовал, но я уверен, что делаю это:
Log l = new Log(line);
if(l.Type == "A") l = new ALog();
Будет либо незаконным, либо уничтожит весь синтаксический анализ, который я сделал, когда впервые создал «Журнал».
Какие-либо предложения?
parse()статическим, как этотpublic static Log Parse(String line), и вернуть соответствующий экземпляр журнала на основе синтаксического анализа. - person Bala R   schedule 21.06.2011