오버로딩과 오버라이드의 차이점은 무엇입니까?
답변
과부하
오버로딩은 동일한 범위에 이름은 같지만 서명이 다른 메서드가 여러 개있는 경우입니다.
//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
}
}
답변
오버로딩 및 재정의에 대한 간단한 정의
오버로딩 (컴파일 시간 다형성) :: 이름이 같고 매개 변수가 다른 함수
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");
}
}
답변
제가 배우는 동안 저에게 많은 의미가있는 예를 공유하고 싶습니다.
이것은 가상 메서드 또는 기본 클래스를 포함하지 않는 예제 일뿐입니다. 주요 아이디어에 대한 힌트를 제공합니다.
자동차 세탁기가 있고 “Wash”라는 기능이 있고 Car를 유형으로 수용한다고 가정 해 보겠습니다.
Car 입력을 받고 Car를 세척합니다.
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
}
}
세차 기능은 이제 차량이 이미 깨끗하고 다시 세차 할 필요가 없는지 확인하는 조건이 있습니다.
-
차가 깨끗하면 왁스를 칠하십시오.
-
깨끗하지 않은 경우 먼저 세차 한 다음 건조시킨 다음 왁스를 칠하십시오
.
따라서 새로운 기능을 추가하거나 완전히 다른 작업을 수행하여 기능을 재정의했습니다.
답변
- 오버로딩 = 여러 메서드 서명, 동일한 메서드 이름
- 재정의 = 동일한 메서드 서명 (가상으로 선언 됨), 하위 클래스에서 구현 됨
기민한 면접관은 다음을 따랐을 것입니다.
답변
Michael이 말했듯이 :
- 오버로딩 = 여러 메서드 서명, 동일한 메서드 이름
- 재정의 = 동일한 메서드 서명 (가상으로 선언 됨), 하위 클래스에서 구현 됨
과
- Shadowing = DerivedClass로 취급하면 파생 된 메서드를 사용하고 BaseClass로하면 기본 메서드를 사용합니다.
답변
이름은 같지만 매개 변수가 다른 메서드 / 생성자를 두 개 이상 갖는 것을 오버로딩이라고합니다. 이것은 컴파일 타임 이벤트입니다.
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 ()에 공통 메소드가 있습니다. 페라리를 인스턴스화했기 때문에 다른 결과를 얻었습니다.
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 클래스의 키워드 virtual 은 Java의 final 과 반대이며 final이 아님을 의미 합니다. Car가 추상적 인 경우 재정의하거나 구현할 수 있습니다.
