我正在寫一個XML解析器,我需要將對象添加到一般類,切換對象的實際類型。問題是,我想保留一個簡單的addElement接口(BaseClass *),然後正確放置對象。什麼是切換對象的實際類型的正確方法?
void E_TableType::addElement(Element *e)
{
QString label = e->getName();
if (label == "state") {
state = qobject_cast<E_TableEvent*>(e);
}
else if (label == "showPaytable") {
showPaytable = qobject_cast<E_VisibleType*>(e);
}
else if (label == "sessionTip") {
sessionTip = qobject_cast<E_SessionTip*>(e);
}
else if (label == "logoffmedia") {
logoffMedia = qobject_cast<E_UrlType*>(e);
}
else {
this->errorMessage(e);
}
}
這是調用類,對象工廠。 myElement是E_TableType的一個實例。
F_TableTypeFactory::F_TableTypeFactory()
{
this->myElement = myTable = 0;
}
void F_TableTypeFactory::start(QString qname)
{
this->myElement = myTable = new E_TableType(qname);
}
void F_TableTypeFactory::fill(const QString& string)
{
// don't fill complex types.
}
void F_TableTypeFactory::addChild(Element* child)
{
myTable->addElement(child);
}
Element* F_TableTypeFactory::finish()
{
return myElement;
}
void F_TableTypeFactory::addAttributes(const QXmlAttributes &attribs) {
QString tName = attribs.value(QString("id"));
myTable->setTableName(tName);
}
正確的方法是最有可能的*不*來。找到更好的解決方案,自動讓元素類型做正確的事情。 – Xeo
元素類型都有不同的數據,所以他們只共享相同的創建界面。 – IslandCow