nakka soft world !

추상클래스와 인터페이스 본문

프로그래밍언어/C++

추상클래스와 인터페이스

nakka 2017. 3. 27. 16:54
728x90

추상클래스와 인터페이스



Interface


class Camera

{

public:

void startRecord() { cout << "Starting Record" << endl; }

void stopRecord() { cout << "Stop Record" << endl; }

};

class HDCamera

{

public:

void startRecord() { cout << "Starting Record HD" << endl; }

void stopRecord() { cout << "Stop Record HD" << endl; }

};

class Car

{

private:

Camera* pCamera = 0;  // 강한 결합(tightly coupling) - 교체 불가능 함

public:

void setBlackBoxCamera(Camera* p) { pCamera = p; }

void startBlackBoxCamera() { pCamera->startRecord(); }

};


int main()

{

Car c;

Camemra cam;

c.setBlackBoxCamera(&cam);

c.startBlackBoxCamera();


HDCamera hdcam;

c.setBlackBoxCamera(&hdcam);  // ?? 되나 ??.. hdcam을 쓰기 위해서는 Car Class의 변수등 바꿔야 함.

}





// 카메라 제작자와 자동차 제작자가 지켜야 하는 규칙을 설정 한다.

// 규칙 : 모든 카메라는 반드시 아래 클래스로부터 파생되어야 한다.

//     -> 모든 카메라는 아래 인터 페이스를 구현해야 한다.


class IBlackBoxCamera

{

public :

virtual void startReord() = 0;

virtual void stopReord() = 0;

virtal ~IBlackBoxCamera() {};

};

class Car

{

private:

IBlackBoxCamera* pCamera = 0;  // IBlackBoxCamera의 파생 class모두 받을 수 있음. 약한 결합.(loosely coupling) - 유연한 디자인

public:

void setBlackBoxCamera(IBlackBoxCamera* p) { pCamera = p; }

void startBlackBoxCamera() { pCamera->startRecord(); }

};


class Camera : public IBlackBoxCamera

{

public:

void startRecord() { cout << "Starting Record" << endl; }

void stopRecord() { cout << "Stop Record" << endl; }

};

class HDCamera : public IBlackBoxCamera

{

public:

void startRecord() { cout << "Starting Record HD" << endl; }

void stopRecord() { cout << "Stop Record HD" << endl; }

};


int main()

{

Car c;

Camemra cam;

c.setBlackBoxCamera(&cam);

c.startBlackBoxCamera();


HDCamera hdcam;

c.setBlackBoxCamera(&hdcam);  // OK.

}



728x90
Comments