Слайд 2: Наследование и полиморфизм

Теория: Наследование классов

Наследование позволяет создавать новые классы на основе существующих, расширяя их функциональность и переиспользуя код.

1. Базовое наследование:

# Базовый класс
class Weapon:
    def __init__(self, name: str, base_atk: int, substat: str):
        self.name = name
        self.base_atk = base_atk
        self.substat = substat
        self.level = 1
        self.refinement = 1
    
    def refine(self) -> None:
        """Улучшение оружия"""
        if self.refinement < 5:
            self.refinement += 1
            print(f"{self.name} улучшено до R{self.refinement}")

# Класс-наследник
class Bow(Weapon):
    def __init__(self, name: str, base_atk: int, substat: str):
        # Вызов конструктора родителя
        super().__init__(name, base_atk, substat)
        self.weapon_type = "Лук"
    
    def charge_shot(self) -> float:
        """Урон заряженной атаки"""
        return self.base_atk * (1.5 + 0.1 * self.refinement)

2. Полиморфизм:

# Базовый класс персонажа
class Character:
    def __init__(self, name: str, element: str):
        self.name = name
        self.element = element
    
    def elemental_skill(self) -> str:
        """Базовая реализация навыка"""
        return "Использует элементальный навык"
    
    def elemental_burst(self) -> str:
        """Базовая реализация взрыва стихии"""
        return "Использует взрыв стихии"

# Конкретные реализации персонажей
class Venti(Character):
    def __init__(self):
        super().__init__("Венти", "Анемо")
    
    def elemental_skill(self) -> str:
        return "Использует Небесную поэзию"
    
    def elemental_burst(self) -> str:
        return "Использует Великую оду ветру"

class Zhongli(Character):
    def __init__(self):
        super().__init__("Чжун Ли", "Гео")
    
    def elemental_skill(self) -> str:
        return "Создает Нефритовый щит"
    
    def elemental_burst(self) -> str:
        return "Вызывает Планету Упадка"

# Полиморфное использование
def use_abilities(character: Character) -> None:
    """Функция работает с любым персонажем"""
    print(f"{character.name}:")
    print(character.elemental_skill())
    print(character.elemental_burst())

Важно помнить:

  • super() используется для вызова методов родительского класса
  • Дочерний класс может переопределять методы родителя
  • Один класс может наследоваться только от одного родителя (в простом наследовании)
  • Полиморфизм позволяет работать с разными классами через общий интерфейс

Задача: Система оружия

Создайте систему классов для разных типов оружия в Genshin Impact:

Подсказка: Пример взаимодействия с классами:

# Пример создания оружия
skyward = Bow("Небесное крыло", 674, "Крит шанс")

# Пример улучшения
skyward.refine()

# Пример расчета урона
normal_damage = skyward.calculate_damage()
charged_damage = skyward.charge_shot()