MST

星途 面试题库

面试题:TypeScript类的实例方法与实例属性在继承中的区别

假设有一个基类`Animal`,包含实例属性`name`和实例方法`makeSound`。再创建一个子类`Dog`继承自`Animal`,并重写`makeSound`方法。同时,在`Dog`类中添加一个新的实例属性`breed`。请详细阐述在继承体系下,实例属性`name`和`breed`以及实例方法`makeSound`的访问控制、内存布局和多态表现上的区别。
31.1万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

访问控制

  1. name属性
    • 定义在Animal基类中,Dog子类继承自Animal,在Python中(假设是Python语言场景,其他语言类似原理),如果name属性没有特殊修饰(如Python中没有像Java的private等严格私有修饰),在Dog类的实例中可以直接访问self.name。例如:
class Animal:
    def __init__(self, name):
        self.name = name
    def makeSound(self):
        print("Generic animal sound")

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)
        self.breed = breed
    def makeSound(self):
        print("Woof!")

dog = Dog("Buddy", "Golden Retriever")
print(dog.name) 
  1. breed属性

    • 定义在Dog子类中,只能在Dog类及其子类的实例中访问。例如,在上述代码中,只有Dog类的实例dog可以通过self.breed(在类方法中)或dog.breed(在类外部)访问。其他非Dog类(或其子类)的对象无法访问breed属性。
  2. makeSound方法

    • 基类Animal定义了makeSound方法,Dog子类重写了该方法。在Dog类的实例中,调用makeSound方法时,会优先调用Dog类中重写的版本。例如:
dog.makeSound() 
  • 这体现了动态绑定(多态的一种实现方式),运行时根据对象的实际类型(这里是Dog)来决定调用哪个版本的makeSound方法。

内存布局

  1. name属性
    • 当创建Dog类的实例时,由于继承,Dog实例会包含Animal类的所有实例属性。name属性会在Dog实例的内存空间中占据一部分,与Animal类中定义name属性时所需的内存大小一致。其内存布局上会紧跟在Dog实例对象的头部(假设对象头部存储元数据等信息)之后(具体布局细节依赖于编程语言和运行时环境)。
  2. breed属性
    • breed属性是Dog类特有的,在Dog实例内存空间中,会在name属性之后分配内存空间来存储breed的值。其内存大小取决于breed的数据类型(例如,如果是字符串,取决于字符串的长度等因素)。
  3. makeSound方法
    • 在Python中,方法是以函数对象的形式存储在类的属性字典中。基类Animal有一个makeSound函数对象,Dog类重写makeSound后,Dog类的属性字典中有自己的makeSound函数对象。当创建Dog实例时,并不直接在实例内存中存储方法的副本,而是通过类指针(在实例对象头部等位置)指向类的属性字典,从而找到对应的makeSound方法。

多态表现

  1. name属性
    • name属性本身不直接体现多态。多态主要体现在行为(方法)上。但不同类型(Animal及其子类)的对象都可能有name属性,并且可以根据对象的类型来获取对应的name值。例如:
animals = [Animal("Generic Animal"), Dog("Buddy", "Golden Retriever")]
for animal in animals:
    print(animal.name) 
  1. breed属性
    • breed属性也不直接体现多态,因为它是Dog类特有的,不存在多种类型的不同实现。只有Dog类及其子类的对象有breed属性。
  2. makeSound方法
    • 这是多态的典型体现。通过基类Animal的引用(如上述animals列表中的元素),在运行时会根据实际对象类型(AnimalDog)调用对应的makeSound方法。例如:
for animal in animals:
    animal.makeSound() 
  • 这样,同样的代码(animal.makeSound()),根据animal实际指向的对象类型(AnimalDog),会产生不同的行为(输出不同的声音),实现了多态。