ぶろぐちぶろぐちHome開発クラスの親子関係と処理の方法について複数の言語で書いてみた2017/11/292017/11/25ぐちクラスの親子関係と処理の方法について複数の言語で書いてみたスポンサーリンクこんにちは!ぐち(@bloguchi)です。!クラスの継承について書いてみよう!という完全に京都に行かんばかりの勢いで思い立ったので、ご紹介します。普段からコード書いてないと忘れちゃってますね。親クラスで文字列の変数1つとメソッド(関数)を1つ定義して、子クラスにメソッド(関数)1つを定義し、実行時は子クラスのインスタンスから自クラスのメソッドを呼び出し、親クラスのメソッドを呼び出し、親クラスの変数を表示するといった簡単な処理を書きます。実行結果は共通して下記のようになります。mainAction()fooJavaまずはjavaからご紹介します。新しいバージョンがリリースされどんどん書き方が変わっていきますが基本的な形は下記のようになるのかなと思います。}}キーワードインスタンス生成クラスからインスタンスを生成するのはnewを使います。インスタンスを格納する変数はクラス型で宣言します。メソッド定義メソッドを定義するには、アクセス修飾子、返却値、メソッド名の順に定義します。返却値の有無によって記述を省略することはできず、返却値がない場合でもvoidの宣言が必要です。クラスの継承クラスの継承を行うためにextendsを指定し親クラス名を記述します。メソッド呼び出しインスタンスからメソッドを呼び出す方法は.(ドット)を使います。変数を定義する際には格納される値に従ったデータ型を宣言します。Kotlin続いてKotlinのコードをご紹介します。}}キーワードインスタンス生成Javaと異なりインスタンスを生成する際にnewは不要です。関数を定義するためにfunを宣言します。返却値がある場合は関数名の最後にコロンを付けて型宣言を行います。返却値がない場合は省略可能です。クラスの継承クラスを継承させるために親クラスにあたるクラスにはopenを宣言します。Javaでいうところのfinalにあたります。継承する子クラスの宣言時にはコロンを付け親クラス名を記述します。働くためデータ型の明示的宣言は不要です。varを宣言し変数名を記述します。スポンサードリンクスポンサーリンクScala続いてScalaをご紹介します。}}キーワードインスタンス生成Javaと同じくnewを使います。関数を定義するためにdefを使います。返却値がある場合は関数名の最後にコロンを付け返却値のデータ型を宣言します。クラスの継承extendsを宣言し、親クラス名を記述します。この辺りはJavaと同じです。関数呼び出しインスタンスから関数を呼び出す方法は.(ドット)を使います。変数定義varを用いて変数を定義しますが、scalaは副作用を嫌う言語ですので可能な限り定数を使うことを推奨しています。そのため不変な変数というと変ですが、上記のコードでいうとstrもsubも定数として宣言すべきとなります。その際はvarではなくvalを使って宣言します。Swift続いてSwiftです。Sub()sub.subAction()sub.mainAction()print(sub.str)キーワードインスタンス生成Javaと異なりインスタンスを生成する際にnewは不要です。関数を定義するためにfuncを使います。返却値がある場合は関数名の最後にコロンを付け返却値のデータ型を宣言します。子クラスの宣言時に、コロン付け親クラス名を記述します。親クラスへの何らかの宣言は不要です。関数呼び出しインスタンスから関数を呼び出す方法は.(ドット)を使います。変数定義varを用いて変数を定義しますが、scalaと同様に可能な限り定数を使うことを推奨しています。そのため上記のコードでいうとstrもsubも定数として宣言すべきとなります。その際はvarではなくletを使って宣言します。scalaはvalですがswiftはletですのでご注意ください。JavaScript続いてJavaScriptのご紹介です。記事が長くなってきましたね。Sub();sub.subAction();sub.mainAction();console.log(sub.str);キーワードインスタンス生成クラスからインスタンスを生成するにはnewを使います。名前は似ていても全く関係のない言語Javaと同じです。←余計にややこしいですね。関数を定義するためにfunctionで宣言します。クラスのように使われているMainやSubもfunctionで定義されていますよね。javascriptでは『すべてがオブジェクトである』という思想の元作られているため、これまでの言語のようにクラスや関数といった区分けがされていません。笑)クラスの継承さきほどの『すべてがオブジェクトである』という考えから、クラスを継承というよりも機能譲渡に近い処理があります。それがprototypeです。(便宜上)継承したいクラスのインスタンスを自身のprototypeオブジェクトに保持することで連鎖的に親クラスにあたるクラスの機能を使えるようになります。関数呼び出しオブジェクトから関数を呼び出す方法は.(ドット)を使います。変数定義varを用いて変数を定義します。省略して変数を宣言しても動いてしまうあたりがJavascriptのややこしいところですが、きちんと意味があります。varを付けると関数スコープ(変数の有効範囲が関数内)となり、省略するとグローバルスコープ(どこからでも参照可能)となります。変数定義の際は必ずvarをつけるように覚えて頂いて問題ありません。ちなみにscalaやswiftのようにletもありますが、javascriptでは定数とはならず、スコープがより狭くなりブロックスコープとなります。スポンサードリンクスポンサーリンクPHP続いてPHPです。PHPはけっこう自由な書き方ができ、下記でご紹介する形がすべてではありませんが、僕の好みとしては下記のようになります。他の多くの言語と同様にnewを使います。時代の流れにより最近はnewをつけずに書ける言語が多くなってきていますのでPHPも将来はどうなるんでしょうね。メソッド定義メソッドを定義するにはfunctionを宣言します。返却値があっても宣言時には省略することができます。PHP7から返却値の明示的宣言が導入されましたので当該環境下では関数名の最後にコロンを付け返却値のデータ型を記述してください。クラスの継承extendsを宣言し、親クラス名を記述します。この辺りはJavaと同じです。メソッド呼び出し多くの言語で採用されている.(ドット)ではなく、->(アロー演算子っていうのかな?)を使います。C言語でよく見る形ですね。変数定義$(ドルマーク)を用いて変数名を記述します。PHPにはデータ型の宣言文がありません。型は自動で定義されています。型推論ではなく自動定義となっています。Objective-c最後に一番やっかいなObj-cのご紹介です。コード量がハンパなく多いので説明がめんどくさいのでコードを見て理解頂ければと思います。他の言語とは一味違い、allocで領域を確保しinitで初期化を行います。このあたりはC言語といいますかSmallTalkちっくと言うべきでしょうか。他の言語でいうところのpublicやprivateなどのアクセス修飾子は–や+で宣言します。ヘッダファイルで定義したものを実装ファイルにて処理を記述します。クラスの継承ヘッダファイルにて子クラスの宣言時にコロンを付けて親クラス名を記述します。メソッド呼び出しObj-cはメッセージ式と呼ばれる表記を用いており、[]を使ってメソッドを呼び出します。変数定義ヘッダファイルにてスコープを定義して変数を宣言します。プロパティなどを使えばgetterやsetterを別途定義する必要もなく自動で作られます。まとめプログラミングでいえばクラス定義や関数の使い方など超基本的なことですが、日頃からコーディングしておかないと忘れちゃいますね。今回はとある言語の参考書をちらちら見ていた際に、ふと思いついて各種言語で書いてみましたが、意識的に日常的に書いていかないといけないなと痛感しました。PG工程から離れたといっても、この業界にいる限りは避けては通れない部分でしょうし、まだまだ若手に負けるわけにもいきませんしね。笑では今回はこの辺で。コメントをキャンセルメールアドレスが公開されることはありません。付いている欄は必須項目ですCommentName*Email*Website上に表示された文字を入力してください。