継承
継承とは、既存のクラスをベースにして新しいクラスを作成することです。
新しいクラスは、既存のクラスの属性やメソッドを引き継ぐことができます。これによって、既存のクラスの機能を拡張することができます。
例えば、自動車をオブジェクトとして考えると、トラックやバスといった、自動車の一種を新たに定義する場合、自動車クラスをベースにしてトラッククラスやバスクラスを作成することができます。
そして、自動車クラスの属性やメソッドを引き継いで、トラッククラスやバスクラスの機能を拡張することができます。
具体的には以下のようなPythonのコードを見てみましょう。
class Vehicle:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def description(self):
return f"{self.year} {self.make} {self.model}"
class Car(Vehicle):
def __init__(self, make, model, year, color, price):
super().__init__(make, model, year)
self.color = color
self.price = price
def description(self):
return super().description() + f" ({self.color}, {self.price}円)"
class Truck(Vehicle):
def __init__(self, make, model, year, payload):
super().__init__(make, model, year)
self.payload = payload
def description(self):
return super().description() + f" ({self.payload}kg)"
class Bus(Vehicle):
def __init__(self, make, model, year, capacity):
super().__init__(make, model, year)
self.capacity = capacity
def description(self):
return super().description() + f" ({self.capacity}人乗り)"
car = Car("Toyota", "Corolla", 2022, "white", 2000000)
truck = Truck("Isuzu", "Elf", 2022, 3000)
bus = Bus("Toyota", "Coaster", 2022, 30)
print(car.description())
print(truck.description())
print(bus.description())
上記の例では、Vehicleというクラスを定義しています。このクラスは、make、model、yearという属性を持ち、description()メソッドが定義されています。そして、このクラスをベースに、Car、Truck、Busという新しいクラスを作成しています。それぞれのクラスは、Vehicleクラスの属性やメソッドを引き継ぎつつ、それぞれの特性を追加しています。
ポリモーフィズム
ポリモーフィズムとは、同じ名前のメソッドが異なるクラスで異なる動作をすることを指します。これによって、同じインターフェースを持つ異なるクラスを統一的に扱うことができます。
例えば、自動車をオブジェクトとして考えると、自動車クラス、トラッククラス、バスクラスといった異なるクラスがありますが、それぞれにdescription()メソッドがある場合、同じインターフェースを持つため、統一的に扱うことができます。
具体的には以下のようなPythonのコードを見てみましょう。
class Vehicle:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def description(self):
return f"{self.year} {self.make} {self.model}"
class Car(Vehicle):
def __init__(self, make, model, year, color, price):
super().__init__(make, model, year)
self.color = color
self.price = price
def description(self):
return super().description() + f" ({self.color}, {self.price}円)"
class Truck(Vehicle):
def __init__(self, make, model, year, payload):
super().__init__(make, model, year)
self.payload = payload
def description(self):
return super().description() + f" ({self.payload}kg)"
class Bus(Vehicle):
def __init__(self, make, model, year, capacity):
super().__init__(make, model, year)
self.capacity = capacity
def description(self):
return super().description() + f" ({self.capacity}人乗り)"
def print_vehicle_description(vehicle):
print(vehicle.description())
car = Car("Toyota", "Corolla", 2022, "white", 2000000)
truck = Truck("Isuzu", "Elf", 2022, 3000)
bus = Bus("Toyota", "Coaster", 2022, 30)
print_vehicle_description(car)
print_vehicle_description(truck)
print_vehicle_description(bus)
上記の例では、Vehicle、Car、Truck、Busという4つのクラスを定義しています。また、print_vehicle_description()という関数も定義しています。この関数は、引数として渡されたオブジェクトのdescription()メソッドを呼び出して、その結果を出力する関数です。
そして、この関数に、car、truck、busの3つのインスタンスを渡して呼び出しています。この結果、それぞれのクラスのdescription()メソッドが呼び出されて、異なる出力が得られます。