2010-01-28 3 views
6

C++ 인터페이스 (http://accu.org/index.php/journals/233)에 대한 기사를 읽었으며 모든 가상 멤버 함수를 개인적으로 만들어야한다고 말하는 부분에서 완전히 분실했습니다 ("분리 강화 "). 그것은 나에게 전혀 의미가 없습니다.C++ 인터페이스를 소개하는 기사에 대한 질문

저자에 따르면, 코드는 다음과 같다 :

class shape { 
public: 
    virtual ~shape(); 
    virtual void move_x(distance x) = 0; 
    virtual void move_y(distance y) = 0; 
    virtual void rotate(angle rotation) = 0; 
    //... 
}; 

class line : public shape { 
public: 
    line(point end_point_1, point end_point_2); 
    //... 
private: 
    virtual ~line(); 
    virtual void move_x(distance x); 
    virtual void move_y(distance y); 
    virtual void rotate(angle rotation); 
    //... 
}; 

그래서 우리가 개인 인 순수 가상 공개 기능, (라인 클래스) 구현이있다.

아무도 move_x 함수를 호출 할 수있는 방법을 설명 할 수 있습니까? 자사의 액세스 지정 내가이 일을하려고하면, 그것은 오류로 이어질 것입니다 개인입니다 :

line my_line(point(0,0), point(1,2)); 
my_line.move_x(-1); // does not compile 

마찬가지로이 드로잉 인터페이스 (기사 앞부분 참조) 중 하나 이러한 기능에 액세스 할 수 없다는 말을 정확?

감사합니다.

+1

방금 ​​코드를 만들려고했는데 소멸자가 개인이기 때문에 컴파일에 실패했습니다. – Patrick

답변

6

아이디어는 shape에 대한 참조 또는 포인터를 통해 이러한 메소드를 사용한다는 것입니다.

이것은 "필요한 것만 표시"또는 자체 문서 형식으로 정당화 될 수 있습니다. 메소드가 의도 된 방식으로 만 호출됨을 증명합니다.

+3

프로그래머 (사용자)에게 인터페이스 만 사용하도록하는 것이 더 좋은 프로그래밍 습관입니다. – Ben

+0

나는 그 생각을 아주 좋아한다고 말할 수 없다. 내가 원하는 선을 원한다면 선이 될 모양이 아니라. 도형에 의해 제공되는 메서드 만 필요로하는 함수가 있다면 그 함수를 도형으로 그 함수에 넘겨 줄 것입니다. 이유를 알 수 없으므로 설명을 +1하십시오. – Patrick

+0

인생에 변화가없는 조언이 아닙니다. 위의 두 줄에 표시된 것처럼 실제로 아무 것도 많이 제한하지 않습니다. 사용자가 규칙을 위반해야하는 경우 사소한 불편을 초래합니다. –

2

나는 기사가이 인용문에서 잘 근거를 강조 생각 : 라인이 그것의 인스턴스를 만드는 것입니다 함께

지금, 유일한 사용자가 할 수 있습니다. 모든 사용은 해당 인터페이스 (예 : 모양)를 사용해야하며 따라서 더 강력한 인터페이스/구현 분리를 시행해야합니다. 이 항목을 떠나기 전에 인터페이스/구현 분리를 적용하는 요점은 사용자에게 수행 할 것을 알리지 않기 위해 입니다. 오히려 의 목적은 논리적 분리를 뒷받침하는 것입니다. 이제 코드 은 키 추상화가 모양 인 것으로 설명하고 해당 줄은 모양 구현을 제공합니다.

즉, line은 그 자체로 재미 있지 않습니다. 이는 shape 인터페이스의 구현 일 뿐이며 다른 구현이있을 수 있습니다. 특히 shape 인터페이스에 관심이 있습니다. 따라서 독립 실행 형 클래스가 아닌이 인터페이스를 통해 구현에만 액세스해야합니다.

4

예를 들어 line 개체가있는 경우 해당 개체를 메서드라고 불러야 할 수 있습니다. 그러나 당신이 그들에게 접근 할 수있는 유일한 방법이 그것이 shape 인터페이스 인 것을 요구하는 것이라면, 그 객체는 객체처럼 보이지 않고 인터페이스의 모음처럼 보입니다.

두 개 이상의 인터페이스를 구현하는 라인을 상상해보십시오.

3

이 조언은 동종의 계층 구조에만 적용됩니다. 즉, 파생 클래스가 새로운 기능을 도입하지 않고 (아마도 생성자 제외) 계층 구조를 재정의하고 기본 클래스 기능을 재정의하는 것입니다. 이 경우 line 인스턴스로 직접 작업 할 필요가 없습니다 (포인터/참조를 통해서만 shape에 연결).

동질적인 계층 구조가 덜한 경우이 조언은별로 의미가 없습니다. 파생 된 클래스가 새 함수를 도입하거나 다른 기본 클래스에서 상속하는 경우 어떻게 적용 할 수 있습니까? 이 경우 파생 클래스의 객체를 직접 직접 사용하려는 경우가 있으며 이러한 조언은 불편을 초래할 수 있습니다.

Herb Sutter의 Non-Virtual Interface (NVI) - 더 급진적이고 다양한 상황에서 사용할 수있는이 아이디어의 발전.

+0

+1, 또한 공변 반환 유형의 사용을 금지합니다. –

관련 문제