コンピューティングの複雑さを探求するには、多くの場合、何かが どのように機能するだけでなく、なぜ、どのようにしてゼロから構築できるのかを理解する必要があります。この記事では、Java を参照ポイントとして使用して、オブジェクト指向プログラミング (OOP) のインターフェイスの概念を詳しく説明し、基本的な C 実装を示します。
私たちの例は、車両価格の計算に焦点を当てています。つまり、車は速度によって価格が設定され、オートバイはエンジン排気量 (cc) によって価格が設定されます。 まず、車両のコア動作を定義する Java インターフェイスから始めます。
<code class="language-java">public interface Vehicle { Integer price(); }</code>
このインターフェースは、Car
クラスと Motorcycle
クラスによって実装されます。
<code class="language-java">public class Car implements Vehicle { private final Integer speed; public Car(Integer speed) { this.speed = speed; } @Override public Integer price() { return speed * 60; } } public class Motorcycle implements Vehicle { private final Integer cc; public Motorcycle(Integer cc) { this.cc = cc; } @Override public Integer price() { return cc * 10; } }</code>
ヘルパー関数は価格を出力します:
<code class="language-java">public static void printVehiclePrice(Vehicle vehicle) { System.out.println("$" + vehicle.price() + ".00"); }</code>
メインメソッドは使用法を示します:
<code class="language-java">public static void main(String[] args) { Car car = new Car(120); Motorcycle motorcycle = new Motorcycle(1000); printVehiclePrice(car); // Output: 00.00 printVehiclePrice(motorcycle); // Output: 000.00 }</code>
これを C で複製するには、別のアプローチが必要です。
C には、Java の組み込みインターフェイス メカニズムがありません。 データには構造体、メソッドには関数を使用してシミュレーションします。 コンパイラはインターフェイスの解決を処理しません。手動で行う必要があります。
私たちの「インターフェース」スケルトン:
<code class="language-c">#include <stdio.h> #include <stdlib.h> typedef enum { VEHICLE_CAR, VEHICLE_MOTORCYCLE } VehicleType; typedef struct { VehicleType type; } Vehicle; void vehicle_free(Vehicle *vehicle); int vehicle_price(Vehicle *vehicle);</code>
Car
実装:
<code class="language-c">typedef struct { VehicleType type; int speed; } Car; Car *car_init(int speed) { Car *car = malloc(sizeof(Car)); car->type = VEHICLE_CAR; car->speed = speed; return car; } void car_free(Car *car) { free(car); } int car_price(Car *car) { return car->speed * 60; }</code>
Motorcycle
実装 (Car
と同様):
<code class="language-c">typedef struct { VehicleType type; int cc; } Motorcycle; Motorcycle *motorcycle_init(int cc) { Motorcycle *motorcycle = malloc(sizeof(Motorcycle)); motorcycle->type = VEHICLE_MOTORCYCLE; motorcycle->cc = cc; return motorcycle; } void motorcycle_free(Motorcycle *motorcycle) { free(motorcycle); } int motorcycle_price(Motorcycle *motorcycle) { return motorcycle->cc * 10; }</code>
価格印刷機能:
<code class="language-c">void print_vehicle_price(Vehicle *vehicle) { printf("$%d.00\n", vehicle_price(vehicle)); }</code>
重要なのは、vehicle_free
ステートメントを使用して vehicle_price
と switch
を実装し、さまざまな車両タイプを処理することです。
<code class="language-c">void vehicle_free(Vehicle *vehicle) { switch (vehicle->type) { case VEHICLE_CAR: car_free((Car *)vehicle); break; case VEHICLE_MOTORCYCLE: motorcycle_free((Motorcycle *)vehicle); break; } } int vehicle_price(Vehicle *vehicle) { switch (vehicle->type) { case VEHICLE_CAR: return car_price((Car *)vehicle); case VEHICLE_MOTORCYCLE: return motorcycle_price((Motorcycle *)vehicle); } }</code>
メイン関数は使用法を示します:
<code class="language-c">int main(void) { Car *car = car_init(120); Motorcycle *motorcycle = motorcycle_init(1000); print_vehicle_price((Vehicle *)car); // Output: 00.00 print_vehicle_price((Vehicle *)motorcycle); // Output: 000.00 vehicle_free((Vehicle *)car); vehicle_free((Vehicle *)motorcycle); return 0; }</code>
この手動インターフェイスのアプローチは、抽象構文ツリー (AST) が同様の構造から恩恵を受ける可能性がある解析などのシナリオで特に役立ちます。 AST 内のさまざまなノード タイプは、一連の関数によって定義された共通の「インターフェイス」にすべて準拠する個別の構造体として表すことができます。
C には組み込みインターフェイスがありませんが、慎重な構造と関数の設計でインターフェイスをシミュレートすると、同様の OOP 原理を実現するための強力なメカニズムが提供されます。 この手動アプローチは柔軟性と制御を提供し、パーサーやインタープリターのような複雑なプロジェクトで特に有益です。
以上がC でのオブジェクト指向プログラミング?インターフェースを最初から実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。