在進行OO時,很容易做到結構統一,這個也容易了解,如下:
class Parent
{
public:
virtual void hello() = 0;
};
class Child1: public Parent
private:
virtual void hello() {
printf("Child1\n"); // 當運作到這裡時,調用棧顯得和Parent毫無關系
}
class Child2: public Parent
printf("Child2\n"); // 當運作到這裡時,調用棧顯得和Parent毫無關系
int main() {
Parent* p = new Child2;
p->hello();
return 0;
}
複制代碼
在上面的設計中,結構是統一的,對外展現的是Parent,但是行為并非統一,當使用gdb列印調用棧時,是看不到Parent的影子的,當系統龐大後,對新人來了解系統會增加一些阻力。如何解決這個問題了?通過統一行為,就可以将這個清晰化。方法是:在Parent中增加一個非抽象方法,由這個新增加的非抽象方法來調用hello,這樣在調用棧中就可以見到Parent的身影了,調用棧顯示有層次感,有助于了解系統。
/* virtual */ void hello() {
do_hello();
virtual void do_hello() = 0;
virtual void do_hello() {
printf("Child1\n"); // 當運作到這裡時,調用棧中會包含Parent -> Child1資訊
printf("Child2\n"); // 當運作到這裡時,調用棧中會包含Parent -> Child2資訊
上面的修改,簡單來看,除了增加代碼和調用次數的缺點外,沒有帶來任何好處,但軟體開發實則為一項工程性的工作,需要考慮到整體性和外部因素等,個人覺得這樣做很值得,特别是當你使用UML作設計時,時序圖将顯得更有條理性。