Яка різниця між перевантаженням і перекриттям.
Яка різниця між перевантаженням і перекриттям.
Відповіді:
Перевантаження
Перевантаження - це те, що у вас є кілька методів одного і того ж обсягу, з тим самим іменем, але різними підписами.
//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
}
}
void
для getStuff
вtest2
getStuff(2, "Hello world!");
або я можу це зробити getStuff("Myname", "Mysurname", "Hello World!");
? Хто-небудь може підтвердити, що це так?
Прості визначення для перевантаження та перекриття
Перевантаження (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");
}
}
Я хочу поділитися прикладом, який мав багато сенсу для мене, коли я вчився:
Це лише приклад, який не включає віртуальний метод або базовий клас. Просто, щоб дати підказку щодо основної ідеї.
Скажімо, є пральна машина для автомобілів, і вона має функцію, яку називають "прання", і приймає автомобіль як тип.
Здійснює введення автомобіля та миє автомобіль.
public void Wash(Car anyCar){
//wash the car
}
Давайте перевантажимо функцію Wash ()
Перевантаження:
public void Wash(Truck anyTruck){
//wash the Truck
}
Функція прання раніше лише мила машину, але тепер її також перевантажено для миття вантажівки.
Давайте перекриємо функцію 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
}
}
Тепер функція прання має умову перевірити, чи машина вже чиста і чи не потрібно її мити повторно.
Якщо Автомобіль чистий, то просто воском його.
Якщо не чисте, то спочатку вимийте машину, потім висушіть її, а потім потріть воском
.
Тож функціональність було замінено, додавши новий функціонал або зробити щось зовсім інше.
Проникливий інтерв'юер хотів би звернутися до:
Як сказав Майкл:
і
Наявність декількох методів / конструкторів з однаковою назвою, але різними параметрами, називається перевантаженням. Це подія під час збирання.
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
у 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, означає не остаточне , ви можете перекрити або реалізувати, якщо Авто було абстрактно
shadowing = підтримує два визначення у похідному класі, а для проектування визначення базового класу він затінює (приховує) похідне визначення класу та навпаки.
Ще один момент, який слід додати.
Перевантаження Більше одного методу з однаковою назвою. Той самий або інший тип повернення. Різні відсутність параметрів або Різний тип параметрів. У тому ж класі або Похідному класі.
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 Компілювати поліморфізм часу та поліморфізм часу виконання
Перевантаження є частиною статичного поліморфізму і використовується для реалізації різного методу з однаковою назвою, але різними підписами. Переоцінка використовується для завершення неповного методу. На мою думку, порівняння між цими двома поняттями не існує, єдине, що схоже, це те, що обидва мають однаковий словник, який закінчився.
Перевантаження методу та переоцінка методів - це 2 різні поняття, абсолютно різні. Перевантаження методу має однакову назву методу, але з різними підписами. Переопределення методу - це зміна типової реалізації методу базового класу у похідному класі. Нижче ви можете знайти 2 чудових відеоуроки, що пояснюють ці поняття.
Перевантаження - це поняття, в якому у вас однакові підписи або методи з однаковим іменем, але різні параметри і переосмислення, у нас однакові імена з різними параметрами також мають успадкування, відоме як переосмислення.