ホームページ > バックエンド開発 > C++ > Cのオブジェクト指向プログラミング?ゼロからインターフェイスを実装します

Cのオブジェクト指向プログラミング?ゼロからインターフェイスを実装します

Robert Michael Kim
リリース: 2025-03-03 17:47:45
オリジナル
476 人が閲覧しました

cオブジェクト指向プログラミング:ゼロからインターフェイスを実装

cは、JavaやC#が実行するのと同じようにインターフェイスを持っていません。 JavaとC#には、実装を提供せずにメソッドシグネチャを指定する契約を定義する明示的なinterfaceキーワードがあります。 cは同様の機能を達成しますが、異なるメカニズムを介して:抽象クラス。 抽象クラスでは、少なくとも1つの純粋な仮想関数(= 0で宣言された関数)を宣言します。 純粋な仮想関数には、抽象クラス内に定義がありません。関数の署名のみを指定します。 抽象クラスから継承するクラスは、すべての純粋な仮想関数に実装を提供する必要があります。そうしないと、抽象的であり、インスタンス化することはできません。 これにより、抽象クラスによって定義された契約が効果的に実施され、Javaまたはc#。および

は、インターフェイスの実装における重要な違い:c対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_;
};
ログイン後にコピー
ログイン後にコピー
の主要な違いは、使用されるメカニズムにある

。 JavaとC#は、明示的なShapeCircleJavaおよびC#インターフェイスにはメソッドシグネチャ(および定数)のみが含まれ、C抽象クラスにはメンバー変数と非純粋な実装(実装)を含めることもできます。 これにより、Cの柔軟性が向上しますが、インターフェイスと実装の明確な分離がそれほど明確ではない場合もあります。RectangleShape最後に、施行は異なります。 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_;
};
ログイン後にコピー
ログイン後にコピー

このコードは多型を示しています。 shape1shape2Shapeへのポインターですが、仮想関数ディスパッチのために、実行時に正しいgetArea()関数(CircleまたはRectangleのいずれか)が呼び出されます。これは、柔軟で保守可能なコードには重要です。

c

c

インターフェイスを活用して、いくつかの設計パターンがインターフェイスの概念に大きく依存しています(cの抽象クラスで表されます)。 2つの例を次に示します。戦略パターン:このパターンは、アルゴリズムのファミリーを定義し、それぞれをオブジェクトとしてカプセル化し、それらを交換可能にします。 抽象クラスはこれらのアルゴリズムのインターフェイスを定義し、コンクリートクラスは特定のアルゴリズムを実装しています。工場のパターン:このパターンは、オブジェクトを作成するためのインターフェイスを定義しますが、サブクラスがどのクラスをインスタンス化するかを決定させます。 抽象クラス(または時には複数)がオブジェクトを作成するためのインターフェイスを定義し、具体的な工場が特定のオブジェクトタイプの作成を実装しています。これらの例は、Cの抽象クラスがインターフェイスの目的に効果的に機能し、柔軟性、維持可能性、拡張性を促進する強力な設計パターンを可能にする方法を示しています。

以上がCのオブジェクト指向プログラミング?ゼロからインターフェイスを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート