桑迪屬於Person類,他轉換爲穆斯林並擁有一個新名字Fatima,並具有Sandy的所有屬性,具有新的穆斯林屬性(例如宗教信仰==伊斯蘭教等)。 。此時,桑迪可以被刪除,而現在的穆斯林階級的法蒂瑪將在今後扮演桑迪的角色。問題是,由於她的新地址,所有認識桑迪的人都不知道法蒂瑪。所有那些知道桑迪的人手動將桑迪的地址改爲法蒂瑪的地址顯然不是一個可以接受的方法。有關如何改進設計的建議?這裏顯示的問題我簡化代碼:將對象轉換爲不同的類
#include <iostream>
#include <string>
#include <typeinfo>
class Person {
std::string name;
Person* bestFriend;
public:
Person (const std::string& newName) : name (newName) {}
virtual ~Person() = default;
std::string getName() const {return name;}
void setName (const std::string& newName) {name = newName;}
Person* getBestFriend() const {return bestFriend;}
void setBestFriend (Person* newBestFriend) {bestFriend = newBestFriend;}
};
class Muslim: public Person {
public:
Muslim (const Person& person) : Person (person) {
// religion = Islam; etc...
}
};
int main() {
Person *mary = new Person ("Mary"), *sandy = new Person ("Sandy");
mary->setBestFriend (sandy);
std::cout << "sandy = " << sandy << ", " << typeid(*sandy).name() << std::endl;
std::cout << mary->getName() << "'s best friend is " << mary->getBestFriend()->
getName() << "." << std::endl;
Muslim* fatima = new Muslim (static_cast<Muslim>(*sandy)); // the big change
fatima->setName ("Fatima"); // should now delete sandy, because fatima takes on every attribue of sandy
std::cout << "fatima = " << fatima << ", " << typeid(*fatima).name() << std::endl;
std::cout << mary->getName() << "'s best friend is " << mary->getBestFriend()->
getName() << "." << std::endl; // still Sandy, of course
}
輸出:
沙= 0x32658,6Person
瑪麗最好的朋友是桑迪。
法蒂瑪= 0x23fec0,6Muslim
瑪麗最好的朋友是桑迪。
當然,我們希望有:瑪麗的最好的朋友是法蒂瑪,與瑪麗 - > getBestFriend() - > getReligion()==伊斯蘭教等... 如何重新設計整個的事情,所以,這是自動化(假設有成千上萬的人認識她)?
我想使用繼承,因爲類穆斯林將有許多複雜的人類方法(以及許多新的數據成員和方法)覆蓋。
繼承似乎在這裏矯枉過正。爲什麼不只有'人'的'宗教'成員? –
@約瑟夫曼斯菲爾德。因爲穆斯林類對Person方法有很多複雜的覆蓋。 – prestokeys
@prestokeys在這種情況下,爲什麼不使用依賴注入來執行這些操作並注入一個基於宗教的不同集合(假設這是您的相關性的工作原理) – DNT