📜  用子类引用子类对象 vs 父类引用(1)

📅  最后修改于: 2023-12-03 14:56:23.284000             🧑  作者: Mango

用子类引用子类对象 vs 父类引用

在面向对象编程(OOP)中,有一个常见的问题:应该使用子类引用子类对象还是父类引用?

问题简述

假设我们有三个类:Animal(动物类)、Dog(狗类)和Cat(猫类),其中DogCat都继承自Animal。现在有一个需要对狗和猫进行处理的函数,应该使用子类引用子类对象还是父类引用?

使用子类引用子类对象

我们可以在函数中直接使用DogCat类的对象,这样可以直接调用它们自己的方法,不需要进行类型转换。

class Animal:
    def __init__(self, name):
        self.name = name

    def eat(self):
        print(f"{self.name} is eating...")


class Dog(Animal):
    def bark(self):
        print(f"{self.name} is barking...")


class Cat(Animal):
    def catch(self):
        print(f"{self.name} is catching mice...")


def process_animals(dog: Dog, cat: Cat):
    dog.bark()
    cat.catch()

这种方法简单、直接,但缺点也很明显:如果以后有更多的子类需要加入进来,那么就需要不停地修改函数的参数。而且如果用父类引用子类对象的话,不管有多少个子类,函数的参数都只需要传递Animal即可,不再需要进行修改。

父类引用

在函数中使用父类引用的话,我们需要进行类型判断和转换,才能调用子类自己的方法。例如:

def process_animals(animal1: Animal, animal2: Animal):
    if isinstance(animal1, Dog):
        animal1.bark()
    if isinstance(animal2, Cat):
        animal2.catch()

这种方法可以适用于有多个子类的情况,但需要进行类型判断和转换,代码相对较长复杂。

结论

使用子类引用子类对象或者使用父类引用,在不同的情况下都有适用的场景。如果只有很少的子类,且不太可能增加,那么使用子类引用子类对象可以让代码更加简洁明了。如果有多个子类,且需要不停地增加,那么使用父类引用可以避免函数参数的长期修改。