MST

星途 面试题库

面试题:Python类继承与多态 - 复杂场景应用

假设你正在开发一个图形绘制系统,定义一个基类`Shape`,包含`draw`方法。创建`Circle`(圆形)、`Rectangle`(矩形)两个子类继承自`Shape`。`Circle`类需要有属性`radius`(半径),`Rectangle`类需要有属性`width`(宽)和`height`(高)。重写`draw`方法,在`Circle`的`draw`方法中打印出圆的面积公式计算结果(面积 = π * radius ** 2),在`Rectangle`的`draw`方法中打印出矩形的面积(面积 = width * height)。要求考虑到代码的规范性和可扩展性,简述这种设计中多态的优势以及如果要添加新的图形类(如三角形),代码应该如何修改。
18.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

代码实现

以下是Python代码示例:

import math


class Shape:
    def draw(self):
        pass


class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def draw(self):
        area = math.pi * self.radius ** 2
        print(f"圆的面积: {area}")


class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def draw(self):
        area = self.width * self.height
        print(f"矩形的面积: {area}")

多态的优势

  1. 可维护性:当图形绘制逻辑发生变化时,只需要修改对应子类的draw方法,而不会影响到其他类。例如,如果圆的面积计算方法有变动,只需修改Circle类中的draw方法,Rectangle类以及其他可能的子类不受影响。
  2. 可扩展性:添加新的图形类非常方便,如添加三角形,只需要创建一个新的子类继承自Shape类,并重写draw方法即可,无需修改现有类的代码。这使得系统易于扩展以支持新的图形类型。
  3. 代码复用:通过继承Shape基类,子类可以复用基类的通用属性和方法(在这个例子中虽然基类方法为空,但在更复杂场景下可能存在通用逻辑),提高了代码的复用性。

添加新图形类(如三角形)的修改方式

  1. 创建新类:创建一个新的类Triangle继承自Shape类。
  2. 添加属性:为Triangle类添加必要的属性,如底(base)和高(height)。
  3. 重写draw方法:在Triangle类中重写draw方法,实现三角形面积的计算和打印(面积 = 0.5 * base * height)。

以下是添加Triangle类后的完整代码:

import math


class Shape:
    def draw(self):
        pass


class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def draw(self):
        area = math.pi * self.radius ** 2
        print(f"圆的面积: {area}")


class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def draw(self):
        area = self.width * self.height
        print(f"矩形的面积: {area}")


class Triangle(Shape):
    def __init__(self, base, height):
        self.base = base
        self.height = height

    def draw(self):
        area = 0.5 * self.base * self.height
        print(f"三角形的面积: {area}")

这样就成功添加了一个新的图形类Triangle,并且整个系统的其他部分不需要做额外修改。