🐙

ケツリカ(結論から理解)する Class内用語集

2024/08/03に公開

自分が分からなくなったとき用のやつです

inheritance and extends (継承と拡張)

継承とは

拡張とは

最小限の例(java)
// 基底クラス
class Animal {
    void makeSound() {
        System.out.println("Some sound");
    }
}

// 派生クラス
class Dog extends Animal {
    void makeSound() {
        System.out.println("Bark");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        myDog.makeSound();  // 出力: Bark
    }
}

constructor (コンストラクタ)

最小限の例(java)
class Person {
    String name;
    int age;

    // コンストラクタ
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void displayInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

public class Main {
    public static void main(String[] args) {
        // コンストラクタを使ってPersonオブジェクトを作成
        Person person = new Person("Alice", 30);
        person.displayInfo();  // 出力: Name: Alice, Age: 30
    }
}

abstract class and method (抽象クラスと抽象メソッド)

抽象クラスとは

抽象メソッドとは

最小限の例(python)
from abc import ABC, abstractmethod

# 抽象クラスの定義
class Animal(ABC):
    @abstractmethod
    def makeSound(self):
        pass  # 具体的な実装は継承クラスで行う

# 具体的なクラス
class Dog(Animal):
    def makeSound(self):
        print("Woof")

class Cat(Animal):
    def makeSound(self):
        print("Meow")

# インスタンス化とメソッド呼び出し
dog = Dog()
cat = Cat()
dog.makeSound()  # 出力: Woof
cat.makeSound()  # 出力: Meow
実際問題どうやって使われるのか(ゲーム開発の例)
from abc import ABC, abstractmethod

class GameObject(ABC):
    @abstractmethod
    def update(self):
        pass

    @abstractmethod
    def draw(self):
        pass

class Player(GameObject):
    def update(self):
        # プレイヤーの位置を更新するコード
        print("Player updating")

    def draw(self):
        # プレイヤーを描画するコード
        print("Player drawing")

class Enemy(GameObject):
    def update(self):
        # 敵の位置を更新するコード
        print("Enemy updating")

    def draw(self):
        # 敵を描画するコード
        print("Enemy drawing")

# ゲームループでの利用
objects = [Player(), Enemy()]
for obj in objects:
    obj.update()
    obj.draw()

interface and implement (インターフェースと実装)

インターフェースとは

実装とは

主に以下の言語で使われます
-Java
-C#
-TypeScript
-Go
-Swift
です。

最小限の例(java)
interface Animal {
    void makeSound();  // 抽象メソッド
    void sleep();      // 抽象メソッド
}

class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof");
    }

    @Override
    public void sleep() {
        System.out.println("Dog is sleeping");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound();  // 出力: Woof
        dog.sleep();      // 出力: Dog is sleeping
    }
}

encapsulation (カプセル化)

なぜ、直接クラスのフィールドに触れてはダメなのか

→不正な値が入る可能性が出てきたりするため

危険な例(java)
class Person {
    public int age;
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.age = -5;  // 不正な値を設定
        System.out.println("Age: " + person.age);  // 出力: Age: -5
    }
}
カプセル化後(java)
class Person {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age >= 0) {
            this.age = age;
        } else {
            System.out.println("Invalid age value");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setAge(-5);  // 不正な値は設定されない
        System.out.println("Age: " + person.getAge());  // 出力: Age: 0
    }
}

polymorphism (ポリモーフィズム)

最小限の例(java)
// 基底クラス
class Animal {
    void makeSound() {
        System.out.println("Some sound");
    }
}

// 派生クラス
class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Meow");
    }
}

// ポリモーフィズムのデモ
public class Main {
    public static void main(String[] args) {
        // Animal型の配列にDogとCatのインスタンスを格納
        Animal[] animals = {new Dog(), new Cat()};

        // 各Animalに対してmakeSoundメソッドを呼び出す
        for (Animal animal : animals) {
            animal.makeSound();  // 出力: Bark と Meow
        }
    }
}

Discussion