天天看點

通過包裝父類的抽象方法達到結構和行為都統一

在進行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作設計時,時序圖将顯得更有條理性。

繼續閱讀