私事ですが今後業務ではC++を使用することになりそうです。
今まではウェブ関連の業務であったり、ちょっとしたテスト程度だったのでJavaを中心に使っていたため、C++の文法など少し忘れ気味です…。
先日もC++で「インターフェイスの予約語なんだっけ?interfaceじゃないの?」と慌てました。
リハビリがてらにインターフェイスをC++で実装してみたいと思います。
そもそもインターフェイスとは?
インターフェイスとは「複数のオブジェクトに関して共通する機能を実装させる」手段です。
時計を例にとると、壁掛け時計であっても、腕時計であっても、AppleWatchであっても「時を刻む」という機能があるはずです。
また新しいデザインの時計を思いついたとしましょう。
このNewClockにもやはり「時を刻む」という機能を追加しなければなりません。
こういった「クラスが実装しなければならない機能を抽象化するもの」がインターフェイスです。
Javaでのインターフェイス
Javaではこのインターフェイスは予約語(interface)として規定されているので、初心者向けの教本などにも記載があります。
簡単なサンプルコードを見てみましょう。
1 2 3 |
public interface Tick { public void ticktack(); // 時間を刻む } |
1 2 3 4 5 |
public class Clock implements Tick { public void ticktack() { // 時間を刻む処理 } } |
上記のように予約語、interfaceを使い、実装しなければならない機能を宣言します。
実装されるクラスでは予約語、implementsに続いて宣言したインターフェイスを記述します。
すると、Clockクラスでticktackメソッドが定義されていない場合はコンパイルエラーとなります。
C++でのインターフェイス
Javaとは異なりC++にはinterfaceという予約語はありません。
しかしデザインパターンなどを使用する場合などインターフェイスを利用したい場合は以下のように実装します。
1 2 3 4 5 6 7 8 9 10 |
// interface class ITick { public : virtual void ticktack() = 0; // 時を刻む }; class CClock : public ITick { public : void ticktack(); // 時を刻む }; |
1 2 3 4 5 |
#include "Clock.h" void CClock::ticktack() { // 時を刻む } |
virtualキーワードを付与することで、そのメンバ関数は仮想関数となり、派生クラスで再定義を可能にします。
さらにメンバ関数を宣言する際に、[ = 0 ]と記載すると定義を省略することができ、この「virtualキーワード + [ = 0]」の組み合わせは純粋仮想関数と呼ばれます。
このように実装することで純粋仮想関数を含むクラスを継承したクラスは純粋仮想関数をオーバーライドしなければオブジェクトの生成ができないようになります。
まとめ
Javaはとても便利なプログラミング言語ですし、利用する機会もほかの言語に比べ比較的多いです。
そのためJavaの便利な部分に慣れすぎていると、いざほかの言語をしようしなければならない場合に躓いてしまうこともありそうです。
今後の業務は結構長期になりそうなので、C++やMFCについて再度勉強しないといけませんね…。