Перегрузка и переопределение
В чем разница между перегрузкой и переопределением.
Ответы
Ответ 1
Перегрузки
Перегрузка - это когда у вас несколько методов в одной и той же области с тем же именем, но с разными сигнатурами.
//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
}
}
Ответ 2
Простые определения для перегрузки и переопределения
Перегрузка (Полиморфизм времени компиляции):: Функции с одинаковым именем и разными параметрами
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");
}
}
Ответ 3
- Перегрузка = множественные сигнатуры методов, одно и то же имя метода
- Переопределение = та же подпись метода (объявленная виртуальная), реализованная в подклассах
Проницательный интервьюер продолжил бы:
Какая разница между переопределением и затенением?
Ответ 4
Я хочу поделиться примером, который мне очень понравился, когда я учился:
Это просто пример, который не включает виртуальный метод или базовый класс. Просто дать намек на основную идею.
Скажем, есть стиральная машина для автомобилей, и у нее есть функция, называемая "Wash", и принимает автомобиль как тип.
Возвращает вход автомобиля и моет автомобиль.
public void Wash(Car anyCar){
//wash the car
}
Позволяет перегрузить функцию Wash()
Перегрузки:
public void Wash(Truck anyTruck){
//wash the Truck
}
Функция мойки только стирала автомобиль раньше, но теперь его перегрузили, чтобы мыть грузовик.
- Если предоставленным входным объектом является Car, он выполнит Wash (Car anyCar)
- Если предоставленным входным объектом является "Грузовик", он будет выполняться
Мойка (грузовик 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
}
}
Функция стирки теперь имеет условие, чтобы проверить, является ли автомобиль уже чистым и его не нужно снова стирать.
-
Если автомобиль чист, то просто промойте его.
-
Если не чистить, сначала промойте автомобиль, затем высушите его, а затем воск
это
.
Таким образом, функциональность была переопределена добавлением новой функциональности или чем-то совершенно другим.
Ответ 5
Как сказал Майкл:
- Перегрузка = множественные сигнатуры методов, одно и то же имя метода
- Переопределение = та же подпись метода (объявленная виртуальная), реализованная в подклассах
и
- Shadowing = Если обработан как DerivedClass, он использует производный метод, если в качестве BaseClass используется базовый метод.
Ответ 6
Наличие нескольких методов/конструкторов с одинаковым именем, но с разными параметрами называется перегрузкой. Это событие времени компиляции.
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));
}
}
О/р
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, мы получаем другой результат.
О/р
Top speed for this car is: 400
Ответ 7
в С# нет скрытого переопределения Java, без ключевого слова переопределить при переопределении метода! см. эти реализации С#:
вариант 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 с ключевым словом override: result is 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 противоположно для final на Java, означает не окончательный, вы можете переопределить или реализовать, если Car был абстрактным
Ответ 8
shadowing = поддерживает два определения в производном классе и для проецирования определения базового класса он затеняет (скрывает) производное определение класса и наоборот.
Ответ 9
Еще один пункт для добавления.
Перегрузка Несколько методов с тем же именем. Тот же или другой тип возврата. Различные параметры или разные параметры. В классе Same Class или Derived.
int Добавить (int num1, int num2)
int Добавить (int num1, int num2, int num3)
double Add (int num1, int num2)
double Добавить (double num1, double num2)
Может быть возможным в том же классе или производном классе.
Обычно предпочитает в одном классе. Например. Console.WriteLine() имеет 19 перегруженных методов.
Может перегружать конструкторы классов, методы.
Можно рассматривать как полиморфизм времени компиляции (статического/раннего связывания).
=============================================== ================================================== ====
Переопределение невозможно в том же классе.
Можно переопределить методы класса, свойства, индексы, события.
Есть некоторые ограничения, такие как
Переопределенный базовый метод должен быть виртуальным, абстрактным или переопределенным.
Вы не можете использовать новые, статические или виртуальные модификаторы для изменения метода переопределения.
Можно рассматривать как полиморфизм времени выполнения (динамическое/позднее связывание).
Помогает в управлении версиями http://msdn.microsoft.com/en-us/library/6fawty39.aspx
=============================================== ================================================== ====
Полезные ссылки
http://msdn.microsoft.com/en-us/library/ms173152.aspx
Полиморфизм времени компиляции и полиморфизм времени выполнения
Ответ 10
Переопределяя, когда мы наследуем базовый класс и делаем производный класс, тогда, если в производном классе есть метод, который имеет то же имя, что и метод (одно имя, тот же аргумент, тот же тип возвращаемого значения), определяют в базовом классе, тогда его называют Overriding..
class Vehicle{
void run()
{
System.out.println("Vehicle is running");
}
}
class Bike2 extends Vehicle{
void run()
{
System.out.println("Bike is running safely");
}
public static void main(String args[]){
Bike2 obj = new Bike2();
obj.run();
}
Выход: Велосипед работает безопасно........ Чтобы лучше понять переопределение, http://javabyroopam.blogspot.in/
Перегрузка Просто два метода, которые имеют одно и то же имя, но имеют другой список аргументов, называются перегрузками.
class Calculation{
void sum(int a,int b){System.out.println(a+b);}
void sum(int a,int b,int c){System.out.println(a+b+c);}
public static void main(String args[]){
Calculation obj=new Calculation();
obj.sum(10,10,10);
obj.sum(20,20);
}
}
вывод 30,20
Ответ 11
Перегрузка является частью статического полиморфизма и используется для реализации другого метода с тем же именем, но с разными сигнатурами. Переопределение используется для завершения неполного метода. На мой взгляд, нет никакого сравнения между этими двумя понятиями, единственное, что похоже, - это то, что оба имеют тот же самый словарь, который закончился.
Ответ 12
Перегрузка метода и переопределение метода - это две разные концепции, совершенно разные. Перегрузка метода имеет одно и то же имя метода, но с разными сигнатурами. Переопределение метода изменяет стандартную реализацию метода базового класса в производном классе. Ниже вы можете найти 2 отличных видеоурока, объясняющих эти концепции.
Метод, перекрывающий скрытие Vs
Перегрузка метода
Ответ 13
перегрузка - это концепция, в которой у вас есть те же подписи или методы с одним и тем же именем, но с разными параметрами и переопределение, мы имеем методы с одинаковыми именами с разными параметрами, а также наследование известно как переопределение