Перегрузка и переопределение

c# inheritance

154560 просмотра

12 ответа

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

Источник Размещён: 12.11.2019 09:14

Ответы (12)


213 плюса

перегрузка

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

//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
        }
}
Автор: cgreeno Размещён: 23.03.2009 03:01

34 плюса

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

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

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");
    }
}
Автор: Devrath Размещён: 27.02.2013 06:36

10 плюса

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

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

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

Получает вход автомобиля и моет автомобиль.

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

Давайте перегрузим функцию Wash ()

Перегрузки:

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

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

  • Если предоставленный объект ввода - Car, он выполнит Wash (Car anyCar).
  • Если предоставленный входной объект - Truck, он выполнит 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
   }     
}

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

  • Если Автомобиль чистый, то просто нанесите его воском.

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

,

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

Автор: curiousBoy Размещён: 16.08.2016 10:13

9 плюса

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

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

Какая разница между переопределением и затенением?

Автор: Michael Meadows Размещён: 23.03.2009 03:07

4 плюса

Как сказал Майкл:

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

а также

  • Shadowing = Если рассматривать как DerivedClass, он использовал производный метод, если в качестве BaseClass он использует базовый метод.
Автор: Migol Размещён: 23.03.2009 03:10

3 плюса

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

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
Автор: Matt Размещён: 28.08.2014 10:56

2 плюса

в 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, означает не final , вы можете переопределить или реализовать, если Car был абстрактным

Автор: Nurlan Размещён: 11.02.2016 05:01

1 плюс

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

Автор: ramya choudary Размещён: 17.02.2011 07:10

1 плюс

Еще один момент, чтобы добавить.

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

int Add (int num1, int num2) int Add (int num1, int num2, int num3) double Add (int num1, int num2) double Add (двойной номер1, двойной номер2)

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

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

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

================================================== ================================================== знак равно

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

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

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

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

================================================== ================================================== знак равно

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

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

Автор: Sai Размещён: 06.08.2014 05:29

1 плюс

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

Автор: Moeed Размещён: 11.04.2016 12:23

0 плюса

Перегрузка метода и переопределение метода - это две разные концепции. Перегрузка метода имеет одно и то же имя, но с разными сигнатурами. Переопределение метода - это изменение реализации метода базового класса по умолчанию в производном классе. Ниже вы можете найти 2 отличных видеоуроков, объясняющих эти понятия.

Переопределение метода против скрытия

Перегрузка метода

Автор: Suresh Размещён: 24.06.2012 04:34

0 плюса

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

Автор: waqas ur Rehman Размещён: 08.12.2013 03:38
Вопросы из категории :
32x32