cは、JavaやC#が実行するのと同じようにインターフェイスを持っていません。 JavaとC#には、実装を提供せずにメソッドシグネチャを指定する契約を定義する明示的な は、インターフェイスの実装における重要な違い:c対java/c 。 JavaとC#は、明示的な このコードは多型を示しています。 c インターフェイスを活用して、いくつかの設計パターンがインターフェイスの概念に大きく依存しています(cの抽象クラスで表されます)。 2つの例を次に示します。戦略パターン:このパターンは、アルゴリズムのファミリーを定義し、それぞれをオブジェクトとしてカプセル化し、それらを交換可能にします。 抽象クラスはこれらのアルゴリズムのインターフェイスを定義し、コンクリートクラスは特定のアルゴリズムを実装しています。工場のパターン:このパターンは、オブジェクトを作成するためのインターフェイスを定義しますが、サブクラスがどのクラスをインスタンス化するかを決定させます。 抽象クラス(または時には複数)がオブジェクトを作成するためのインターフェイスを定義し、具体的な工場が特定のオブジェクトタイプの作成を実装しています。これらの例は、Cの抽象クラスがインターフェイスの目的に効果的に機能し、柔軟性、維持可能性、拡張性を促進する強力な設計パターンを可能にする方法を示しています。interface
キーワードがあります。 cは同様の機能を達成しますが、異なるメカニズムを介して:抽象クラス。 抽象クラスでは、少なくとも1つの純粋な仮想関数(= 0
で宣言された関数)を宣言します。 純粋な仮想関数には、抽象クラス内に定義がありません。関数の署名のみを指定します。 抽象クラスから継承するクラスは、すべての純粋な仮想関数に実装を提供する必要があります。そうしないと、抽象的であり、インスタンス化することはできません。 これにより、抽象クラスによって定義された契約が効果的に実施され、Javaまたはc#。class Shape {
public:
virtual double getArea() = 0; // Pure virtual function - makes Shape abstract
virtual void draw() = 0; // Another pure virtual function
};
class Circle : public Shape {
public:
Circle(double radius) : radius_(radius) {}
double getArea() override { return 3.14159 * radius_ * radius_; }
void draw() override { /* Implementation to draw a circle */ }
private:
double radius_;
};
class Rectangle : public Shape {
public:
Rectangle(double width, double height) : width_(width), height_(height) {}
double getArea() override { return width_ * height_; }
void draw() override { /* Implementation to draw a rectangle */ }
private:
double width_;
double height_;
};
Circle
JavaおよびC#インターフェイスにはメソッドシグネチャ(および定数)のみが含まれ、C抽象クラスにはメンバー変数と非純粋な実装(実装)を含めることもできます。 これにより、Cの柔軟性が向上しますが、インターフェイスと実装の明確な分離がそれほど明確ではない場合もあります。Rectangle
Shape
最後に、施行は異なります。 JavaおよびC#は、コンパイル時にインターフェイスの実装を強制します。 cは主にコンパイル時にそれを強制しますが、派生クラスがすべての純粋な仮想関数を正しく実装しない場合(未定義の動作につながる)場合はランタイムエラーが発生する可能性があります。 Cでは、基本クラスへの仮想関数とポインター/参照によって達成されます。 抽象クラスをインターフェイスとして使用する場合、多型により、さまざまな派生クラスのオブジェクトをポインターまたは基本クラスへの参照(抽象クラス)を介して均一に扱うことができます。class Shape {
public:
virtual double getArea() = 0; // Pure virtual function - makes Shape abstract
virtual void draw() = 0; // Another pure virtual function
};
class Circle : public Shape {
public:
Circle(double radius) : radius_(radius) {}
double getArea() override { return 3.14159 * radius_ * radius_; }
void draw() override { /* Implementation to draw a circle */ }
private:
double radius_;
};
class Rectangle : public Shape {
public:
Rectangle(double width, double height) : width_(width), height_(height) {}
double getArea() override { return width_ * height_; }
void draw() override { /* Implementation to draw a rectangle */ }
private:
double width_;
double height_;
};
shape1
とshape2
はShape
へのポインターですが、仮想関数ディスパッチのために、実行時に正しいgetArea()
関数(Circle
またはRectangle
のいずれか)が呼び出されます。これは、柔軟で保守可能なコードには重要です。c
以上がCのオブジェクト指向プログラミング?ゼロからインターフェイスを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。