C++ 인터페이스(추상 클래스)
인터페이스는 클래스의 특정 구현을 완료하지 않고도 클래스의 동작과 기능을 설명합니다.
C++ 인터페이스는 추상 클래스를 사용하여 구현됩니다. 추상 클래스와 데이터 추상화는 서로 혼동되지 않습니다. 데이터 추상화는 구현 세부 사항과 관련 데이터를 분리하는 개념입니다.
클래스에서 하나 이상의 함수가 순수 가상 함수로 선언되면 해당 클래스는 추상 클래스입니다. 순수 가상 함수는 아래와 같이 선언에서 "= 0"을 사용하여 지정됩니다.
class Box { public: // 纯虚函数 virtual double getVolume() = 0; private: double length; // 长度 double breadth; // 宽度 double height; // 高度 };
추상 클래스(흔히 ABC라고도 함)를 설계하는 목적은 다른 클래스에 적절한 기본 클래스를 제공하는 것입니다. 추상 클래스는 객체를 인스턴스화하는 데 사용할 수 없으며 인터페이스로만 사용할 수 있습니다. 추상 클래스의 개체를 인스턴스화하려고 하면 컴파일 오류가 발생합니다.
따라서 ABC의 하위 클래스를 인스턴스화해야 하는 경우 각 가상 함수를 구현해야 합니다. 이는 C++에서 ABC를 사용하여 인터페이스를 선언하는 것을 지원한다는 의미이기도 합니다. 순수 가상 함수가 파생 클래스에 오버로드되지 않은 경우 이 클래스의 개체를 인스턴스화하려고 하면 컴파일 오류가 발생합니다.
객체를 인스턴스화하는 데 사용할 수 있는 클래스를 구체 클래스라고 합니다.
추상 클래스의 예
아래 예를 참조하세요. 기본 클래스 Shape는 두 개의 파생 클래스인 Rectangle과 Triangle에서 각각 구현되는 인터페이스getArea()를 제공합니다.getArea():
#include <iostream> using namespace std; // 基类 class Shape { public: // 提供接口框架的纯虚函数 virtual int getArea() = 0; void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // 派生类 class Rectangle: public Shape { public: int getArea() { return (width * height); } }; class Triangle: public Shape { public: int getArea() { return (width * height)/2; } }; int main(void) { Rectangle Rect; Triangle Tri; Rect.setWidth(5); Rect.setHeight(7); // 输出对象的面积 cout << "Total Rectangle area: " << Rect.getArea() << endl; Tri.setWidth(5); Tri.setHeight(7); // 输出对象的面积 cout << "Total Triangle area: " << Tri.getArea() << endl; return 0; }
위의 경우 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
Total Rectangle area: 35 Total Triangle area: 17
위의 예에서 추상 클래스가 인터페이스 getArea()를 정의하는 방법과 두 파생 클래스가 이를 구현하기 위해 서로 다른 알고리즘을 통해 면적을 계산하는 방법을 볼 수 있습니다. 동일한 기능.
디자인 전략
객체 지향 시스템은 추상 기본 클래스를 사용하여 모든 외부 애플리케이션에 적절하고 공통적이며 표준화된 인터페이스를 제공할 수 있습니다. 그런 다음 파생 클래스는 추상 기본 클래스를 상속하여 유사한 모든 작업을 상속합니다.
외부 애플리케이션에서 제공하는 함수(즉, 공용 함수)는 추상 기본 클래스에 순수 가상 함수 형태로 존재합니다. 이러한 순수 가상 함수는 해당 파생 클래스에서 구현됩니다.
이 아키텍처를 사용하면 시스템이 정의된 후에도 새 애플리케이션을 시스템에 쉽게 추가할 수 있습니다.