MST
星途 面试题库

面试题:Ruby单例模式下类方法的继承与重写

假设你有一个父类采用了单例模式并定义了一些类方法,现在创建一个子类,子类也使用单例模式。请说明子类如何继承父类的类方法,以及在子类中重写这些类方法时需要注意哪些要点,同时解释重写后如何保证单例特性不受影响,给出相应代码示例。
28.3万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试
  1. 子类继承父类类方法
    • 在Python中,子类会自动继承父类的类方法。当定义子类时,只要父类的类方法不是私有的(即方法名不以双下划线开头),子类实例就可以直接调用父类的类方法。
  2. 重写类方法要点
    • 方法签名:重写的方法应该保持与父类方法相同的方法名和参数列表,以确保接口的一致性。
    • 调用父类方法:如果在重写的方法中需要调用父类的同名方法,可以使用super()函数。这样可以保证父类方法中的逻辑也能得到执行,除非明确不需要执行父类方法的逻辑。
  3. 保证单例特性不受影响
    • 子类重写类方法时,需要确保不会破坏单例模式的实现。这意味着在重写的方法中,不能重新实例化对象,除非这是业务逻辑所必需的且处理得当。通常,单例模式的实现依赖于类级别的变量来保存唯一的实例,重写方法时要避免意外修改这些变量导致创建多个实例。
  4. 代码示例(Python)
class SingletonMeta(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super().__call__(*args, **kwargs)
        return cls._instances[cls]


class Parent(metaclass = SingletonMeta):
    @classmethod
    def class_method(cls):
        print("This is the parent class method.")


class Child(Parent):
    @classmethod
    def class_method(cls):
        # 调用父类方法
        super().class_method()
        print("This is the child class method, overriding the parent method.")


# 测试
parent_instance = Parent()
parent_instance.class_method()

child_instance = Child()
child_instance.class_method()

# 验证单例特性
print(parent_instance is Parent())
print(child_instance is Child())

在上述代码中:

  • SingletonMeta是一个元类,用于实现单例模式。Parent类使用这个元类实现单例。
  • Parent类定义了一个类方法class_method
  • Child类继承自Parent类,并对class_method进行了重写。在重写的方法中,首先调用了父类的class_method,然后添加了子类特有的逻辑。
  • 最后通过验证parent_instance is Parent()child_instance is Child()来确认单例特性没有受到影响。