Перевантаження і переосмислення


104

Яка різниця між перевантаженням і перекриттям.


2
@james: ти хоча б спробував google ??
Мітч Пшеничний

Я здогадуюсь, ти цього не збираєшся.
Джон Б

Джеймс - напевно, ні, і я відчуваю себе досить нерозумно, не маючи можливості пояснити просту концепцію

1
@james я здогадуюсь, чи ти інтуїтував ці поняття, не знаючи термінів. Я буду здогадуватися, що ти самоучка. Вам, мабуть, варто взяти книгу C # для початківців, щоб не вчитися, а підсилювати те, що ви вже знаєте. Це розумно, але дуже допоможе в інтерв'ю для технологій.
Майкл Медоуз

Ви можете прочитати більше за цим посиланням: intquesans.blogspot.com/2011/05/…

Відповіді:


219

Перевантаження

Перевантаження - це те, що у вас є кілька методів одного і того ж обсягу, з тим самим іменем, але різними підписами.

//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
        }
}

1
я люблю цю відповідь @cgreeno .. Дякую
Ферраккем Бхуянь

1
@cgreeno я думаю , що ви пропустите voidдля getStuffвtest2
Махді

2
лише зазначимо, що метод базового класу повинен бути позначений як віртуальний, щоб перекрити інше, ви отримаєте помилку компіляції.
Алекс Стівенс

Гей, це може бути старим, але у мене все ще є питання з цього приводу. Чи надає перевантаження доступною функціональність за допомогою методу 'one'? Як я можу це зробити: getStuff(2, "Hello world!");або я можу це зробити getStuff("Myname", "Mysurname", "Hello World!");? Хто-небудь може підтвердити, що це так?
Sj03rs

Я думаю, що прикладом переосмислення насправді є Overwriting, override - це коли метод суперкласу переосмислити випадково або якщо ви маєте намір це зробити, використовуючи нове ключове слово в обох випадках, переознакуйте або перезапишіть, поведінка відрізняється, коли ви оголосили Parent p = new Дитина (); p.Method (); ... можливо я помиляюся, і це просто інший спосіб зробити майже те саме. Хтось може пояснити це краще, ніж я?
Крістіна Карраско,

35

Прості визначення для перевантаження та перекриття

Перевантаження (Compile Time Polymorphism) :: Функції з однойменною назвою та різними параметрами

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");
    }
}

Можливо, ви хочете додати, що переважаюча концепція стосується батьківських відносин клас-підклас.
Freakyuser

10

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

Це лише приклад, який не включає віртуальний метод або базовий клас. Просто, щоб дати підказку щодо основної ідеї.

Скажімо, є пральна машина для автомобілів, і вона має функцію, яку називають "прання", і приймає автомобіль як тип.

Здійснює введення автомобіля та миє автомобіль.

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

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

Перевантаження:

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

Функція прання раніше лише мила машину, але тепер її також перевантажено для миття вантажівки.

  • Якщо наданим вхідним об'єктом є Автомобіль, він виконає 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
   }     
}

Тепер функція прання має умову перевірити, чи машина вже чиста і чи не потрібно її мити повторно.

  • Якщо Автомобіль чистий, то просто воском його.

  • Якщо не чисте, то спочатку вимийте машину, потім висушіть її, а потім потріть воском

.

Тож функціональність було замінено, додавши новий функціонал або зробити щось зовсім інше.


1
Це має бути відповіддю. Проголосували +
Джек

9
  • Перевантаження = Кілька підписів методів, однакова назва методу
  • Перевизначення = Підпис того ж методу (оголошено віртуальним), реалізований у підкласах

Проникливий інтерв'юер хотів би звернутися до:

Яка різниця між перекриттям і затіненням?


Ніколи не знав, що це називається затінення, добре знати. Єдине відношення перевантаження і переосмислення - це перенавантаження.
Самуїл

4

Як сказав Майкл:

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

і

  • Shadowing = Якщо трактувати як DerivedClass, він використовує похідний метод, якщо як BaseClass він використовує базовий метод.

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

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();
    }

Ключове слово віртуальне для класу Car протилежне остаточному на Java, означає не остаточне , ви можете перекрити або реалізувати, якщо Авто було абстрактно


1

shadowing = підтримує два визначення у похідному класі, а для проектування визначення базового класу він затінює (приховує) похідне визначення класу та навпаки.


1

Ще один момент, який слід додати.

Перевантаження Більше одного методу з однаковою назвою. Той самий або інший тип повернення. Різні відсутність параметрів або Різний тип параметрів. У тому ж класі або Похідному класі.

int Add (int num1, int num2) int Add (int num1, int num2, int num3) подвійний Add (int num1, int num2) подвійний Add (подвійний num1, подвійний num2)

Може бути можливим в тому ж класі або похідному класі. Зазвичай воліє в тому ж класі. Наприклад, Console.WriteLine () має 19 перевантажених методів.

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

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

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

Переопределення неможливо в одному класі. Може переосмислити методи класу, властивості, індекси, події класу.

Має деякі обмеження, такі як метод переосмисленої основи повинен бути віртуальним, абстрактним або переосмисленим. Ви не можете використовувати нові, статичні або віртуальні модифікатори для зміни методу заміщення.

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

Допомагає у версіях http://msdn.microsoft.com/en-us/library/6fawty39.aspx

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

Корисні Посилання

http://msdn.microsoft.com/en-us/library/ms173152.aspx Компілювати поліморфізм часу та поліморфізм часу виконання


Хороший, з необхідними деталями.
користувач3885927

1

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


Капітан тут: Перевантаження методу дає вам кілька підписів різних методів з одним іменем. Переосмислення приховує успадкований член або від класів, або від інтерфейсів. летить геть
SparK

1
@SparK Переопределення не приховує учасника. Ви можете або змінити або приховати спадковий член. Два варіанти є взаємовиключними.
Сервіс

@ Серві, неправильний вибір слів, я мав на увазі "замінники".
SparK

0

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

Метод перекриття Vs приховування

Метод перевантаження


0

Перевантаження - це поняття, в якому у вас однакові підписи або методи з однаковим іменем, але різні параметри і переосмислення, у нас однакові імена з різними параметрами також мають успадкування, відоме як переосмислення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.