Перегрузка и переопределение - PullRequest
101 голосов
/ 23 марта 2009

В чем разница между перегрузкой и переопределением.

Ответы [ 12 ]

211 голосов
/ 23 марта 2009

Перегрузка

Перегрузка - это когда у вас несколько методов в одной и той же области, с одинаковым именем, но разными сигнатурами.

//Overloading
public class test
{
    public void getStuff(int id)
    {}
    public void getStuff(string name)
    {}
}

Перекрытие

Переопределение - это принцип, который позволяет изменять функциональные возможности метода в дочернем классе.

//Overriding
public class test
{
        public virtual void getStuff(int id)
        {
            //Get stuff default location
        }
}

public class test2 : test
{
        public override void getStuff(int id)
        {
            //base.getStuff(id);
            //or - Get stuff new location
        }
}
34 голосов
/ 27 февраля 2013

Простые определения для перегрузки и переопределения

Перегрузка (Полиморфизм времени компиляции) :: Функции с одинаковыми именами и разными параметрами

public class A
{
    public void print(int x, int y)
    {
        Console.WriteLine("Parent Method");
    }
}

public class B : A
{
    public void child()
    {
        Console.WriteLine("Child Method");
    }

    public void print(float x, float y)
    {
        Console.WriteLine("Overload child method");
    }
}

Переопределение (Полиморфизм времени выполнения) :: Функции в расширенном классе с тем же именем и теми же параметрами, что и в базовом классе, но с другим поведением.

public class A
{
    public virtual void print()
    {
        Console.WriteLine("Parent Method");
    }
}

public class B : A
{
    public void child()
    {
        Console.WriteLine("Child Method");
    }

    public override void print()
    {
        Console.WriteLine("Overriding child method");
    }
}
9 голосов
/ 17 августа 2016

Я хочу поделиться примером, который имел для меня большой смысл, когда я учился:

Это просто пример, который не включает виртуальный метод или базовый класс. Просто, чтобы дать подсказку относительно основной идеи.

Допустим, есть машина для мойки автомобилей, в которой есть функция, называемая «Мойка», и она принимает автомобиль в качестве типа.

Получает данные о машине и моет машину.

public void Wash(Car anyCar){
       //wash the car
}

Перегрузим функцию Wash ()

Перегрузка:

public void Wash(Truck anyTruck){
   //wash the Truck  
}

Раньше функция стирки использовалась только для мойки автомобилей, но теперь она перегружена и для мойки грузовиков.

  • Если предоставленный объект ввода - Car, он выполнит Wash (Car anyCar)
  • Если предоставленный входной объект - Грузовик, то он выполнится Wash (Truck anyTruck)

Давайте переопределим функцию Wash ()

Перекрытие:

public override void Wash(Car anyCar){
   //check if the car has already cleaned
   if(anyCar.Clean){ 
       //wax the car
   }
   else{
       //wash the car
       //dry the car
       //wax the car
   }     
}

Функция стирки теперь имеет условие, чтобы проверить, чиста ли машина и не нуждается ли в повторной стирке.

  • Если машина чистая, то просто нанесите ее воском.

  • Если не чистить, то сначала помойте машину, затем высушите, а затем воск он

.

Таким образом, функциональность была переопределена добавлением новой функциональности или выполнением чего-то совершенно другого.

9 голосов
/ 23 марта 2009
  • Перегрузка = несколько сигнатур методов, одно и то же имя метода
  • Переопределение = та же сигнатура метода (объявлена ​​виртуальной), реализована в подклассах

Проницательный интервьюер следил бы за:

В чем разница между переопределением и затенением?

4 голосов
/ 23 марта 2009

Как сказал Михаил:

  • Перегрузка = несколько сигнатур методов, одно и то же имя метода
  • Переопределение = та же сигнатура метода (объявлена ​​виртуальной), реализована в подклассах

и

  • Shadowing = Если рассматривать как DerivedClass, он использовал производный метод, если в качестве BaseClass он использует базовый метод.
3 голосов
/ 28 августа 2014

Наличие нескольких методов / конструкторов с одинаковыми именами, но разными параметрами, называется перегрузкой. Это событие времени компиляции.

Class Addition 
{
   int add(int a, int b) 
   {
     return a+b;
   }
   int add(int a, int b, int c)
   {
     return a+b+c;
   }

   public static main (String[] args) 
   {
     Addition addNum = new Addition();
     System.out.println(addNum.add(1,2));
     System.out.println(addNum.add(1,2,3));
   }
}

O / P:

3
6

Переопределение - это событие времени выполнения, означающее, что в зависимости от вашего кода выходные данные изменяются во время выполнения.

class Car
{
    public int topSpeed() 
    {
        return 200;
    }
}
class Ferrari extends Car
{
    public int topSpeed()
    {
        return 400;
    }
    public static void main(String args[])
    {
        Car car = new Ferrari();
        int num= car.topSpeed();
        System.out.println("Top speed for this car is: "+num);
    }
}

Обратите внимание, что в обоих классах есть общий метод topSpeed ​​(). Поскольку мы создали экземпляр Ferrari, мы получаем другой результат.

O / P:

Top speed for this car is: 400
2 голосов
/ 11 февраля 2016

в C # нет Java, например скрытое переопределение, без ключевого слова переопределение в методе переопределения! посмотрите эти реализации C #:

вариант 1 без переопределение : результат 200

    class Car {
        public int topSpeed() {
            return 200;
        }
    }

    class Ferrari : Car {
        public int topSpeed(){
                return 400;
        }
    }

    static void Main(string[] args){
        Car car = new Ferrari();
        int num= car.topSpeed();
        Console.WriteLine("Top speed for this car is: "+num);
        Console.ReadLine();
    }

вариант 2 с переопределить ключевое слово : результат равен 400

    class Car {
        public virtual int topSpeed() {
            return 200;
        }
    }

    class Ferrari : Car {
        public override int topSpeed(){
                return 400;
        }
    }

    static void Main(string[] args){
        Car car = new Ferrari();
        int num= car.topSpeed();
        Console.WriteLine("Top speed for this car is: "+num);
        Console.ReadLine();
    }

ключевое слово virtual в классе Car противоположно для final в Java, означает not final , вы можете переопределить или реализовать, если Car был абстрактным

1 голос
/ 11 апреля 2016

Перегрузка является частью статического полиморфизма и используется для реализации разных методов с одинаковыми именами, но разными сигнатурами. Переопределение используется для завершения неполного метода. По моему мнению, нет никакого сравнения между этими двумя понятиями, единственное, что сходно, так это то, что оба имеют один и тот же словарный запас, который закончился.

1 голос
/ 06 августа 2014

Еще один момент для добавления.

Перегрузка Более одного метода с одинаковым именем. Тот же или другой тип возврата. Различное количество параметров или Различный тип параметров. В том же классе или производном классе.

int Add (int num1, int num2) int Add (int num1, int num2, int num3) двойное добавление (int num1, int num2) двойной Добавить (двойной номер1, двойной номер2)

Может быть возможно в том же классе или производном классе. Обычно предпочитает в том же классе. Например. Console.WriteLine () имеет 19 перегруженных методов.

Может перегружать конструкторы классов, методы.

Может рассматриваться как полиморфизм времени компиляции (статическое / раннее связывание).

=============================================== ================================================== ====

Переопределение невозможно в том же классе. Может переопределять методы класса, свойства, индексаторы, события.

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

Может рассматриваться как полиморфизм времени выполнения (динамическое / позднее связывание).

Помогает в управлении версиями http://msdn.microsoft.com/en-us/library/6fawty39.aspx

=============================================== ================================================== ====

Полезные ссылки

http://msdn.microsoft.com/en-us/library/ms173152.aspx полиморфизм времени компиляции и полиморфизм времени выполнения

1 голос
/ 17 февраля 2011

shadowing = поддерживает два определения в производном классе и для проекции определения базового класса затеняет (скрывает) определение производного класса и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...