Re: [問題] 一個設計上的問題(virtual function)
※ 引述《rabbit0321 (fish)》之銘言:
: 我在程式中宣告了一個 base class 的 pointer object,礙於有時候我想用該 object 去
: call subclass 專屬的 funciton 時要強制轉型才能達成(如以下ex),這會造成我的程
: 式碼又長又醜(若命名長一點的話...)
: ex. RD 與 PM 繼承 Employee
: Employee* A;
: (RD*)A->get_RD();
: (PM*)A->get_PM();
: 所以我想把該 function 變成 virtual 去實做,但是又遇到以下幾個問題......
: 我在 base class 設定一個 pure virtual funciton,但是這個 function 並不是所有的
: sub class 都會實做到,如果該 pure virtual funciton 沒有被底下每一個
: sub class 實做到的時候,沒實做到該 funciton 的 sub class 在 compile 時會出現
: error: cannot allocate an object of abstract type......
: 又,如果我不將該 virtual funciton 設成 pure,那麼在 base class 就必須實作它,
: 可是這樣就會違背原本設計想法的意義(該 function 明明就是只有 sub class 才用得
: 到,為什麼一定要我在 base class 中去實做它),如果實做了裡面不做事還 ok,但是
: 遇到那種 get data 類型的 function,必須回傳一個東西,我又不知道該怎麼辦才好了
: ......
: 是否最前者就是比較好的方法了呢?
: 又或者有沒有其他更好的設計?
: 謝謝大家!!!
這個叫做Liskov Substitution Principle、"圓形-橢圓形問題"或是"正方形-長方形問題"
struct base
{
virtual ~base() = default;
virtual int foo() const = 0;
};
struct derived : base
{
virtual int foo() const override
{
// don't want to return an int.
}
};
OOP常講public inheritance是一種"is-a"(是一個)的概念,
這裡宣告了一個base,而且宣告當你有一個base物件,
然後你call它的foo method的時候,它會return一個int回來,
再來derived繼承了base(dervied是一個base),所以當你有一個dervied物件,
你call它的foo method也應該要return一個int,
要不然你說他是一個base,但是它又和base的行為不一樣,那你怎麼能說他是一個base呢?
至於要怎麼解決這個問題,這要看你的情況,以上面的例子舉例來說,
那我就改宣告base的foo method"可能"會return一個int,像這樣:
struct base
{
virtual ~base() = default;
// or int*, std::tuple<int, bool>, boost::variant<int, nothing>...
virtual boost::optional<int> foo() const = 0;
};
struct derived : base
{
virtual boost::optional<int> foo() const override
{
// don't want to return an int.
return {};
}
};
std::unique_ptr<base> b = new derived{};
const auto r = b->foo();
if (r)
{
// use *r if foo() returns an integer
}
else
{
// foo() returns nothing
}
不過我猜你的問題可能是parent包含了太多的功能,
例如你的employee可能有a和b兩種功能,但是你的rd只需要a的功能,
這時候你rd如果derive empolyee就會發生問題,
這種情況下你可以試著把a和b拆開來,然後讓原本employee的subclasses去繼承需要的部份
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.235.102
※ 編輯: PkmX 來自: 140.113.235.102 (12/15 21:54)
※ 編輯: PkmX 來自: 140.113.235.102 (12/15 22:14)
推
12/16 20:59, , 1F
12/16 20:59, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):