クラスの親子関係と処理の方法について複数の言語で書いてみた

スポンサードリンク

こんにちは!ぐち(@bloguchi)です。

そうだ!クラスの継承について書いてみよう!

という完全に京都に行かんばかりの勢いで思い立ったので、ご紹介します。普段からコード書いてないと忘れちゃってますね。めちゃくちゃ初歩的なことやのに。

実行結果

親クラスで文字列の変数1つとメソッド(関数)を1つ定義して、子クラスにメソッド(関数)1つを定義し、実行時は子クラスのインスタンスから自クラスのメソッドを呼び出し、親クラスのメソッドを呼び出し、親クラスの変数を表示するといった簡単な処理を書きます。

実行結果は共通して下記のようになります。

called subAction()
called mainAction()
foo

Java

まずはjavaからご紹介します。新しいバージョンがリリースされどんどん書き方が変わっていきますが基本的な形は下記のようになるのかなと思います。

ソースコード

public class Main {
    public String str = "foo";

    public void mainAction() {
        System.out.println("called mainAction()");
    }

    public static void main(String[] args) {
        Sub sub = new Sub();
        sub.subAction();
        sub.mainAction();
        System.out.println(sub.str);
    }
}

class Sub extends Main {
    public void subAction() {
        System.out.println("called subAction()");
    }
}

キーワード

Kotlin

続いてKotlinのコードをご紹介します。

ソースコード

fun main(args: Array<String>) {
    var sub = Sub()
    sub.subAction()
    sub.mainAction()
    println(sub.str)
}

open class Main {
    var str = "foo"

    fun mainAction() {
        println("called mainAction()")
    }
}

class Sub : Main() {
    fun subAction() {
        println("called subAction()")
    }
}

キーワード

Scala

続いてScalaをご紹介します。

ソースコード

object Main extends App{
    var sub = new Sub()
    sub.subAction()
    sub.mainAction()
    println(sub.str)
}

class Main {
    var str = "foo"

    def mainAction() {
        println("called mainAction()")
    }
}

class Sub extends Main {
    def subAction() {
        println("called subAction()")
    }
}

キーワード

Swift

続いてSwiftです。

ソースコード

class Main {
    var str = "foo"

    func mainAction() {
        print("called mainAction()")
    }
}

class Sub: Main {
    func subAction() {
        print("called subAction()")
    }
}

var sub = Sub()
sub.subAction()
sub.mainAction()
print(sub.str)

キーワード

JavaScript

続いてJavaScriptのご紹介です。ちょっと記事が長くなってきましたね。

ソースコード

var Main = function() {
    this.str = 'foo';

    this.mainAction = function() {
        console.log('called mainAction()');
    };
}

var Sub = function() {
    this.subAction = function() {
        console.log('called subAction()');
    };
};

Sub.prototype = new Main();
var sub = new Sub();
sub.subAction();
sub.mainAction();
console.log(sub.str);

キーワード

PHP

続いてPHPです。PHPはけっこう自由な書き方ができ、下記でご紹介する形がすべてではありませんが、僕の好みとしては下記のようになります。

ソースコード

class Main {
    public $str = "foo";

    public function mainAction() {
        print("called mainAction()");
    }
}

class Sub extends Main {
    public function subAction() {
        print("called subAction()");
    }
}

$sub = new Sub();
$sub->subAction();
print(PHP_EOL);
$sub->mainAction();
print(PHP_EOL);
print($sub->str);

キーワード

Objective-c

最後に一番やっかいなObj-cのご紹介です。コード量がハンパなく多いので説明がめんどくさいのでコードを見て理解頂ければと思います。笑

ソースコード

#import <Foundation/Foundation.h>

@interface Main : NSObject {
    @public
        NSString *str;
}
- (id)init;
- (void)mainAction;
@end
#import "Main.h"

@implementation Main
- (id)init {
    self = [super init];
    if (self != nil) {
        str = @"foo";
    }
    return self;
}

- (void)mainAction {
    printf("called mainAction()\n");
}
@end
#import <Foundation/Foundation.h>
#import "Main.h"

@interface Sub : Main {
}
- (void)subAction;
@end
#import "Sub.h"

@implementation Sub
- (void)subAction {
    printf("called subAction()\n");
}
@end
#import <Foundation/Foundation.h>
#import "Sub.h"

int main(void){
    Sub *sub = [[Sub alloc] init];
    [sub subAction];
    [sub mainAction];
    printf(sub->str);
    return 0;
}

キーワード

まとめ

プログラミングでいえばクラス定義や関数の使い方など超基本的なことですが、日頃からコーディングしておかないと忘れちゃいますね。今回はとある言語の参考書をちらちら見ていた際に、ふと思いついて各種言語で書いてみましたが、意識的に日常的に書いていかないといけないなと痛感しました。

PG工程から離れたといっても、この業界にいる限りは避けては通れない部分でしょうし、まだまだ若手に負けるわけにもいきませんしね。笑

では今回はこの辺で。