← Назад к вопросам

В чем разница между классом new и override?

2.3 Middle🔥 121 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между new и override в контексте наследования

Это вопрос о C# и других языков с явным контролем наследования. Хотя Python имеет свой подход, концепция важна для понимания парадигм объектно-ориентированного программирования.

Контекст: C# / Java / C++

Вопрос касается модификаторов для переопределения методов в наследовании. Python обрабатывает это по-другому, но концепция остается важной.

Override - переопределение в наследовании

// C#
public class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic sound");
    }
}

public class Dog : Animal
{
    public override void MakeSound()  // override - переопределяю метод родителя
    {
        Console.WriteLine("Woof!");
    }
}

Kлючевое слово override означает:

  • Метод уже существует в родительском классе
  • Я переопределяю его поведение
  • Полиморфизм: при вызове через ссылку на Animal, вызовется метод Dog

New - скрытие метода

public class Animal
{
    public void Speak()
    {
        Console.WriteLine("Animal speaks");
    }
}

public class Dog : Animal
{
    public new void Speak()  // new - создаю НОВЫЙ метод, скрывающий старый
    {
        Console.WriteLine("Woof!");
    }
}

Animal animal = new Dog();
animal.Speak();  // Выведет "Animal speaks" - вызовется метод Animal

Dog dog = new Dog();
dog.Speak();  // Выведет "Woof!" - вызовется метод Dog

Главное различие

Параметрoverridenew
Что происходитПереопределение методаСкрытие метода
ПолиморфизмРаботает (вызовется переопределенный)Не работает (вызовется по типу переменной)
ТребованиеРодитель должен быть virtualРодитель может быть обычным
КомпилерПроверяет сигнатуруТолько предупреждение
Использование99% случаевРедко, обычно ошибка

Пример с полиморфизмом

list<Animal> animals = new List<Animal>
{
    new Dog(),
    new Cat(),
    new Bird()
};

foreach (var animal in animals)
{
    animal.Speak();  // Полиморфизм: каждый класс выведет свой звук
}

// Выведет:
// Woof!
// Meow!
// Tweet!

Это работает ТОЛЬКО если использован override.

Если использован new, выведет:

Animal speaks
Animal speaks
Animal speaks

Как это работает в Python

Python НЕ имеет new и override. Python всегда ведет себя как override:

class Animal:
    def speak(self):
        print("Animal speaks")

class Dog(Animal):
    def speak(self):  # Просто переопределяю
        print("Woof!")

# Полиморфизм работает автоматически
animal = Dog()
animal.speak()  # Выведет "Woof!"

# Вызов метода родителя
class Dog(Animal):
    def speak(self):
        super().speak()  # Вызовет Animal.speak()
        print("Woof!")   # А затем наш код

Когда это важно

Это важно в:

  • C#, Java, C++ - языки с явной типизацией и контролем наследования
  • Проектировании иерархии классов
  • Обеспечении полиморфизма
  • Предотвращении ошибок при наследовании

Лучшие практики

Правило:

  • Если расширяешь функциональность существующего метода → используй override
  • Если скрываешь метод из политических причин → это обычно ошибка дизайна

Практический пример (Python)

from abc import ABC, abstractmethod

class DataProcessor(ABC):
    @abstractmethod
    def process(self, data):
        pass

class JSONProcessor(DataProcessor):
    def process(self, data):
        import json
        return json.loads(data)

class XMLProcessor(DataProcessor):
    def process(self, data):
        import xml.etree.ElementTree as ET
        return ET.fromstring(data)

# Полиморфизм
processors: list[DataProcessor] = [
    JSONProcessor(),
    XMLProcessor()
]

for processor in processors:
    result = processor.process(data)  # Вызовется нужный метод

Заключение

Override - это переопределение метода с сохранением полиморфизма.

New - это скрытие метода, нарушающее полиморфизм.

Практически всегда нужен override. New используется редко и обычно указывает на проблему в дизайне класса.

В Python нет явного различия - всегда работает как override. Используй super() для вызова методов родителя.

В чем разница между классом new и override? | PrepBro