У меня было трудное формулирование моего названия, поэтому позвольте мне попытаться уточнить сейчас. Во-первых вот мой соответствующий код:Как вызвать метод подкласса в списке суперкласса, содержащем подклассы
class Question
{
static bool checkFile(XElement q)
{
foreach (XElement a in q.Descendants())
{
if (a.Name.LocalName == "file")
{
return true;
}
}
return false;
}
protected string questionText;
protected List<File> files;
protected Question question;
public Question(XElement q)
{
questionText = q.Element("questiontext").Element("text").Value.ToString();
string name = q.Attribute("type").Value.ToString();
if (checkFile(q))
files.Add(new File(q));
}
}
class multichoice : Question
{
private List<string> answers;
public multichoice(XElement q)
: base(q)
{
foreach (XElement a in q.Elements())
{
if (a.Name.LocalName == "answer")
answers.Add(a.Element("text").Value.ToString());
}
}
public void writeQuestion(HtmlTextWriter writer)
{
writer.RenderBeginTag("p");
writer.Write("<strong>Multiple Choice: </strong>" + this.questionText);
writer.RenderEndTag();
writer.AddAttribute("type", "A");
writer.RenderBeginTag("ol");
foreach (string answer in answers)
{
writer.RenderBeginTag("li");
writer.Write(answer);
writer.RenderEndTag();
}
writer.RenderEndTag();
}
}
class truefalse : Question
{
public truefalse(XElement q)
: base(q)
{
}
public void writeQuestion(HtmlTextWriter writer)
{
writer.RenderBeginTag("strong");
writer.Write("True or False : ");
writer.RenderEndTag();
writer.Write(questionText);
}
}
Так я создаю несколько типов вопросов все они являются подклассами «Вопрос». Вопрос содержит все данные, относящиеся к каждому типу вопроса, и эти подклассы содержат уникальные для них методы, основной из которых - «writeQuestion». Теперь то, что я пытаюсь сделать с ним что-то вроде этого:
static List<Question> collectQuestions(XDocument doc)
{
XDocument xdoc = doc;
string elementName = null;
List<Question> questions = null;
foreach (XElement q in xdoc.Descendants("question"))
{
elementName = q.Attribute("type").Value.ToString();
if (elementName != "category")
continue;
if (elementName == "truefalse")
questions.Add(new truefalse(q)); //writeTrueFalse(writer, q);
else if (elementName == "calculatedmulti")
questions.Add(new calculatedmulti(q)); // writeCalculatedMulti(writer, q);
else if (elementName == "calculatedsimple")
questions.Add(new calculatedsimple(q)); // writeCalculatedSimple(writer, q);
else if (elementName == "ddwtos")
questions.Add(new Draganddrop(q)); //writeDragAndDrop(writer, q);
else if (elementName == "description")
questions.Add(new Description(q)); // writeDescription(writer, q);
else if (elementName == "essay")
questions.Add(new Essay(q)); // writeEssay(writer, q);
else if (elementName == "gapselect")
questions.Add(new Gapselect(q)); // writeGapSelect(writer, q);
else if (elementName == "matching")
questions.Add(new Matching(q)); // writeMatching(writer, q);
else if (elementName == "multichoice")
questions.Add(new multichoice(q)); // writeMultipleChoice(writer, q);
else if (elementName == "multichoiceset")
questions.Add(new Allornothing(q)); // writeAllOrNothing(writer, q);
else if (elementName == "numerical")
questions.Add(new Numerical(q)); // writeNumerical(writer, q);
else if (elementName == "shortanswer")
questions.Add(new shortanswer(q)); // writeShortAnswer(writer, q);
else
continue;
}
return questions;
}
questions = collectQuestions(someDocument);
foreach (Question question in questions)
{
question.writeQuestion(writer);
}
Есть ли способ вызова writeQuestion по каждому из пунктов? прямо сейчас он, конечно же, дает ошибку, что вопросы не содержат определения для writeQuestion, даже если каждый из его подклассов. Прошу прокомментировать, если я должен добавить что-то еще для разъяснений, мой код немного искалечен, поскольку я неоднократно его перерабатывал. Я прилично новичок в работе с такими классами, поэтому мне могут не хватать некоторых ключевых концепций, пожалуйста, укажите все, что вы видите, благодарю вас.
Почему в вопросительном суперклассе нет метода 'writeQuestion'? Либо добавьте его, либо создайте для этого интерфейс. – RBarryYoung
Кстати, когда Эрик Липперт прав насчет того, как решить вашу проблему, я вижу непонятное разделение проблем: вы связываете свои классы с тем, как они представлены как HTML. Это очень плохая идея. –
@Matias Fidemraizer, то, что делает мой полный код, - это разбор XML-файла и переформатирование его в необходимый формат в html-файле. Я храню данные, которые мне нужны в этих вопросах, а также блок кода, который представлен каждым вопросом. Затем я выводя эти блоки в файл. Пока это хорошо работает. Что делает это плохой идеей и что вы предложите вместо этого? – Zannith