2016-06-17 3 views
0

나는이 기사 http://www.gotw.ca/publications/mill18.htm Herb Sutter 에의 해 가고있다. 저자는 비 가상 인터페이스를 작성하는 것은에서 인터페이스 사양 "구현 세부 사항 (즉, 내부적으로 사용자 정의 행동)"비 가상 인터페이스를 사용하는 것이 바람직한 이유는 무엇입니까?

// Example 1: A traditional base class. 
// 
class Widget 
{ 
public: 
    // Each of these functions might optionally be 
    // pure virtual, and if so might or might not have 
    // an implementation in Widget; see Item 27 in [1]. 
    // 
    virtual int Process(Gadget&); 
    virtual bool IsDone(); 
    // ... 
}; 

는 위의 예에서 구현 세부 사항 (또는 사용자 정의 행동)의 어떤 종류를 지정 않습니다를 분리 것을 언급? 가상 인터페이스가 아닌 위의 코드에 대해 약간 혼란 스럽습니다.

답변

0

가상 공용 인터페이스 int Process(Gadget&);을 지정하면이 공개 인터페이스와 일치하도록 확장 인터페이스도 제한됩니다. 이 클래스를 확장하는 사람은 Process 함수를 구현하여이 작업을 수행해야합니다.

더 깨끗한 공용 인터페이스와 사용자 정의를 위해 더 잘 설계된 개인 기능을 제공하면 두 가지 목표를 개별적으로 처리 할 수 ​​있습니다.

1

customizable behavior은 다른 Derived Classes에 의해 제공되는 구현 즉, Interface에서 파생되는 클래스를 의미합니다.

이 있다면 :

class IMachine 
{ 
    public: 
     int ProcessJob() 
     { 
      cout << "Processing Job in By-Default way" << endl; 
     } 
     virtual int ProcessOrder() 
     { 
      cout << "Processing Order in By-Default way" << endl; 
     } 
}; 
class CMachine_A : public IMachine 
{ 
    public: 
     int ProcessJob() 
     { 
      cout << "Processing Job in Machine A's way" << endl; 
     } 
     int ProcessOrder() 
     { 
      cout << "Processing Order in Machine A's way" << endl; 
     } 
}; 
class CMachine_B : public IMachine 
{ 
    public: 
     int ProcessJob() 
     { 
      cout << "Processing Job in Machine B's way" << endl; 
     } 
     int ProcessOrder() 
     { 
      cout << "Processing Order in Machine B's way" << endl; 
     } 
}; 

IMachine *pMachine; 
CMachine_A oMachineA; 
CMachine_B oMachineB; 

pMachine = &oMachineA; 
pMachine->ProcessJob(); 
pMachine = &oMachineB; 
pMachine->ProcessJob(); 

Output: 
Processing Job in By-Default way 
Processing Job in By-Default way 

따라서 다른 구체적인 구현 예에 비록 pMachine 포인트 (읽어 파생 클래스) 위의 예에서, 출력에 관계없이 선택된 구현/유도 클래스와 동일하다. 즉, 시스템 A 및 시스템 B의 customizable behavior이 유효하지 않거나 존중되지 않습니다. 따라서 가상이 아닌IMachine::ProcessJob() 인터페이스를 사용하여 인터페이스 IMachine은 사용되는 시스템 유형 (CMachine_A 또는 CMachine_B)과 관계없이 작업이 처리되는 방식을 분리/무시/억제했습니다.

이제 이것을 고려해야

여기
IMachine *pMachine; 
CMachine_A oMachineA; 
CMachine_B oMachineB; 

pMachine = &oMachineA; 
pMachine->ProcessOrder(); 
pMachine = &oMachineB; 
pMachine->ProcessOrder(); 

Output: 
Processing Order in Machine A's way 
Processing Order in Machine B's way 

때 다른 구체적인 구현 (읽어 파생 클래스)에 pMachine 점, 출력 선택된 구현/파생 된 클래스에 따른 것이다. 즉, A 머신과 B 머신의 customizable behavior이 효력을 발생하거나 존중합니다. 따라서 가상IMachine::ProcessOrder()을 가지고 인터페이스 IMachine은 사용 된 기계 유형 (CMachine_A 또는 CMachine_B)에 따라 주문이 처리되는 옵션/방법을 계속 열었습니다. 인터페이스 IMachine 함수 ProcessOrder위한 customizable behavior를 제공 할 수 ProcessOrdervirtual 따라서 다른 구현/유도 된 클래스를 유지하고 이후에 짧은

.

관련 문제