Abstract Class

추상 클래스는 인스턴스가 아니라 약속을 남긴다

순수 가상 함수가 있는 클래스는 직접 만들 수 없다. 대신 호출자가 기대하는 최소 행동과 파생 클래스가 채워야 할 책임을 분명히 한다.

01

호출자 언어를 남긴다

구체 타입 이름 없이도 필요한 행동을 표현할 수 있는 함수만 추상 클래스에 둔다.

02

구현 의무 표시

파생 클래스가 반드시 제공해야 할 함수는 pure virtual로 둔다.

03

공통 인터페이스를 최소화한다

템플릿 메서드처럼 공통 순서를 제공하되, 확장 지점이 너무 많아지지 않게 한다.

interface
얇은 계약 상태 없이 virtual 함수와 virtual destructor만 둔 형태가 가장 단순하다.
데이터 멤버가 들어가면 결합이 커진다.
pure virtual
생성 불가 파생 클래스가 구현하지 않으면 그 클래스도 추상 클래스가 된다.
컴파일러가 빠뜨린 구현을 잡는다.
default body
공통 동작 순수 가상 함수도 정의를 가질 수 있지만 호출 방식이 까다롭다.
명확한 이유가 있을 때만 쓴다.
dependency
테스트 경계 추상 타입을 인자로 받으면 fake나 mock으로 외부 시스템을 떼어낼 수 있다.
소유권 타입도 함께 정한다.

계약 크기 · 소멸자 · 대안 점검

계약 크기 파생 클래스가 원하지 않는 함수까지 구현하도록 강제하고 있지 않은가.
소멸자 인터페이스로 삭제될 가능성이 있으면 virtual destructor가 있는가.
대안 템플릿이나 std::function이 더 단순한 호출 경계인지 비교한다.

작은 인터페이스

class Clock {
public:
    virtual ~Clock() = default;
    virtual std::chrono::system_clock::time_point now() const = 0;
};