プログラム言語ごとのオブジェクト指向の扱い

オブジェクト指向プログラミング(OOP)は、データとそれに関連する処理をオブジェクトとしてカプセル化し、コードを再利用しやすく、拡張可能にする設計手法です。以下に、代表的なプログラミング言語ごとのオブジェクト指向の特徴を整理します。


1. C++

  • クラスとオブジェクト
  class Animal {
  public:
      void speak() {
          std::cout << "Animal speaks" << std::endl;
      }
  };

  Animal dog;
  dog.speak();
  • 継承
  class Dog : public Animal {
  public:
      void bark() {
          std::cout << "Dog barks" << std::endl;
      }
  };
  • ポリモーフィズム
  class Animal {
  public:
      virtual void speak() {
          std::cout << "Animal speaks" << std::endl;
      }
  };

  class Dog : public Animal {
  public:
      void speak() override {
          std::cout << "Dog barks" << std::endl;
      }
  };

2. Java

  • クラスとオブジェクト
  class Animal {
      void speak() {
          System.out.println("Animal speaks");
      }
  }

  Animal dog = new Animal();
  dog.speak();
  • 継承
  class Dog extends Animal {
      void bark() {
          System.out.println("Dog barks");
      }
  }
  • ポリモーフィズム
  Animal animal = new Dog();
  animal.speak(); // Dog barks

3. Python

  • クラスとオブジェクト
  class Animal:
      def speak(self):
          print("Animal speaks")

  dog = Animal()
  dog.speak()
  • 継承
  class Dog(Animal):
      def bark(self):
          print("Dog barks")
  • ポリモーフィズム
  class Animal:
      def speak(self):
          print("Animal speaks")

  class Dog(Animal):
      def speak(self):
          print("Dog barks")

  animal = Dog()
  animal.speak() # Dog barks

4. JavaScript

  • クラスとオブジェクト
  class Animal {
      speak() {
          console.log("Animal speaks");
      }
  }

  const dog = new Animal();
  dog.speak();
  • 継承
  class Dog extends Animal {
      bark() {
          console.log("Dog barks");
      }
  }
  • ポリモーフィズム
  const animal = new Dog();
  animal.speak(); // Dog barks

5. C#

  • クラスとオブジェクト
  class Animal {
      public void Speak() {
          Console.WriteLine("Animal speaks");
      }
  }

  Animal dog = new Animal();
  dog.Speak();
  • 継承
  class Dog : Animal {
      public void Bark() {
          Console.WriteLine("Dog barks");
      }
  }
  • ポリモーフィズム
  class Animal {
      public virtual void Speak() {
          Console.WriteLine("Animal speaks");
      }
  }

  class Dog : Animal {
      public override void Speak() {
          Console.WriteLine("Dog barks");
      }
  }

  Animal animal = new Dog();
  animal.Speak(); // Dog barks

6. Ruby

  • クラスとオブジェクト
  class Animal
      def speak
          puts "Animal speaks"
      end
  end

  dog = Animal.new
  dog.speak
  • 継承
  class Dog < Animal
      def bark
          puts "Dog barks"
      end
  end
  • ポリモーフィズム
  class Animal
      def speak
          puts "Animal speaks"
      end
  end

  class Dog < Animal
      def speak
          puts "Dog barks"
      end
  end

  animal = Dog.new
  animal.speak # Dog barks

7. Kotlin

  • クラスとオブジェクト
  open class Animal {
      open fun speak() {
          println("Animal speaks")
      }
  }

  val dog = Animal()
  dog.speak()
  • 継承
  class Dog : Animal() {
      fun bark() {
          println("Dog barks")
      }
  }
  • ポリモーフィズム
  class Dog : Animal() {
      override fun speak() {
          println("Dog barks")
      }
  }

  val animal: Animal = Dog()
  animal.speak() // Dog barks

8. Rust

  • 構造体とトレイト (Rustは純粋なOOPではありませんが、類似機能を持つ)
  struct Dog;

  trait Animal {
      fn speak(&self);
  }

  impl Animal for Dog {
      fn speak(&self) {
          println!("Dog barks");
      }
  }

  let dog = Dog;
  dog.speak();

違いのまとめ

言語クラスのサポート継承ポリモーフィズム特徴
C++高いパフォーマンスと柔軟性
JavaJVM上で動作し移植性が高い
Python動的型付けとシンプルな構文
JavaScriptプロトタイプベースの継承
C#.NET環境と強力なライブラリ
Ruby簡潔な構文と柔軟性
KotlinJavaとの互換性が高い
Rust✗ (トレイトで代用)所有権と安全性を重視

オブジェクト指向の特徴を理解することで、設計やコードの再利用性を向上させることができます。