Tôi đang sử dụng một nhà máy trừu tượng để tạo các thành phần giao diện người dùng như hộp thoại. Nhà máy trừu tượng được sử dụng được trả lại từ một "INode" chung hiện được chọn, là lớp cơ sở cho một số loại nút khác nhau. Vì vậy, ví dụ, nếu tôi muốn thêm một nút mới cùng loại như các nút chọn, kịch bản đi một cái gì đó như thế này:Sự cố khi sử dụng nhà máy trừu tượng
(xin lưu ý đây là mã bán pseudo)
Người dùng nhấp nút và nút được lưu trữ để sử dụng sau:
void onTreeNodeSelected(INode *node)
{
selectedNode = node;
}
người dùng nhấp "add" vào giao diện người dùng:
void onAddClicked()
{
IFactory *factory = selectedNode->getFactory();
Dialog *dialog = factory->createAddDialog(parentWidget);
dialog->show();
}
Mà tất cả có vẻ tốt đẹp. Sự cố xảy ra khi tôi muốn chỉnh sửa nút đã chọn:
void onEditClicked()
{
IFactory *factory = selectedNode->getFactory();
Dialog *dialog = factory->createEditDialog(selectedNode, parentWidget);
dialog->show();
}
Oh dear .. Tôi đang chuyển đối tượng INode. Tại một số điểm tôi sẽ phải downcast rằng để các loại nút chính xác để hộp thoại có thể sử dụng nó đúng cách.
Tôi đã nghiên cứu mã nguồn "PostgreSQL Admin 3" và chúng thực hiện tương tự như vậy. Họ làm tròn nó bằng cách làm một cái gì đó như thế này:
FooObjectFactoryClass::createDialog(IObject *object)
{
FooObjectDialog *dialog = new FooObjectDialog((FooObject*)object);
}
Yeck .. cast!
Cách duy nhất tôi có thể nghĩ xung quanh nó và vẫn có thể sử dụng các nhà máy của tôi là để tiêm nút riêng của mình vào nhà máy trước khi nó được trả về:
FooNode : INode
{
FooNodeFactory* FooNode::getFactory()
{
fooNodeFactory->setFooNode(this);
return fooNodeFactory;
}
}
Vì vậy, sau đó chỉnh sửa sự kiện của tôi có thể làm điều này:
void onEditClicked()
{
IFactory *factory = selectedNode->getFactory();
Dialog *dialog = factory->createEditDialog(parentWidget);
dialog->show();
}
Và nó sẽ sử dụng nút được chèn cho ngữ cảnh.
Tôi giả sử nếu không có mã được tiêm, createEditDialog có thể xác nhận sai hoặc cái gì đó.
Mọi suy nghĩ?
Cảm ơn!