C #에서 재정의와 새 키워드의 차이점은 무엇입니까?
클래스 계층 구조에서 메서드를 정의 할 때 C #에서 override
및 new
키워드 의 차이점은 무엇입니까 ?
다음 페이지는 귀하의 질문을 매우 잘 요약합니다.
요약
재정의 : 파생 클래스에서 기본 클래스의 메서드를 재정의하면 호출 코드가 개체가 파생 클래스의 인스턴스라는 것을 "인식"하지 않은 경우에도 파생 클래스의 버전이 사용됩니다.
New : override 대신 new 키워드를 사용하는 경우 파생 클래스의 메서드가 기본 클래스의 메서드를 재정의하지 않고 단순히 숨 깁니다.
new 또는 override를 지정하지 않으면 결과 출력은 new를 지정한 것과 동일하지만 컴파일러 경고도 표시됩니다 (기본 클래스에서 메서드를 숨기고 있다는 것을 알지 못할 수 있기 때문). 또는 실제로 재정의하고 싶을 수 있으며 키워드를 포함하는 것을 잊었습니다.)
Override : 기본 클래스에서 가상 / 추상 / 재정의 유형의 메소드와 함께 사용
신규 :베이스 클래스가 메소드를 가상 / 추상 / 재정의로 선언하지 않은 경우
new
메서드를 재정의하는 대신 완전히 새로운 메서드 (동일한 서명이있을 수도 있고 없을 수도 있음)로 메서드를 섀도 잉하므로 다형성이 작동하지 않습니다. 예를 들어 다음과 같은 클래스가 있습니다.
class A {
public virtual int Hello() {
return 1;
}
}
class B : A {
new public int Hello(object newParam) {
return 2;
}
}
class C : A {
public override int Hello() {
return 3;
}
}
이렇게하면 :
A objectA;
B objectB = new B();
C objectC = new C();
Console.WriteLine(objectB.Hello(null)); // 2
Console.WriteLine(objectC.Hello()); // 3
objectA = objectB;
Console.WriteLine(objectA.Hello()); // 1
objectA = objectC;
Console.WriteLine(objectA.Hello()); // 3
를 사용하여 새 메서드 서명을 정의 할 수 있으므로 new
의 인스턴스 A
가 실제로의 인스턴스 B
이고 새 메서드 B
정의를 사용할 수 있어야 함을 컴파일러가 알 수 없습니다. new
부모 개체의 방법, 재산, 필드 또는 이벤트가 선언되지 않은 경우 사용할 수 있습니다 virtual
, 때문에 부족의 virtual
상속 방법 "을 찾아"하지 않습니다 컴파일러. 로 virtual
하고 override
, 그러나, 그것은 작동합니다.
피하는 것이 좋습니다 new
. 다른 것으로 인식 될 수있는 이름으로 메서드를 정의하고 있기 때문에 기껏해야 혼란 스럽습니다. 최악의 경우 실수를 숨기고 불가능 해 보이는 버그를 도입하고 기능 확장을 어렵게 만들 수 있습니다.
오래된 질문 인 것 같습니다. 다른 답변을 시도해 보겠습니다.
new
: 이름에서 알 수 있듯이 상속 계층 구조의 새 구성원이며 체인 아래에있는 기본 구성원으로 사용됩니다 (가상으로 표시된 경우).override
: 그것은 부모 클래스의 멤버 구현을 수락하지 않고 다르게 할 것임을 의미합니다.
다음 클래스 계층을 고려하십시오.
using System;
namespace ConsoleApp
{
public static class Program
{
public static void Main(string[] args)
{
Overrider overrider = new Overrider();
Base base1 = overrider;
overrider.Foo();
base1.Foo();
Hider hider = new Hider();
Base base2 = hider;
hider.Foo();
base2.Foo();
}
}
public class Base
{
public virtual void Foo()
{
Console.WriteLine("Base => Foo");
}
}
public class Overrider : Base
{
public override void Foo()
{
Console.WriteLine("Overrider => Foo");
}
}
public class Hider : Base
{
public new void Foo()
{
Console.WriteLine("Hider => Foo");
}
}
}
위 코드의 출력은 다음과 같아야합니다.
Overrider => Foo
Overrider => Foo
Hider => Foo
Base => Foo
- 다음
overrides
을 적용하여 가상 메서드 의 하위 클래스를 만듭니다override modifier
.hide
의도적으로 멤버 를 원하는 경우new modifier
하위 클래스의 멤버 에을 적용 할 수 있습니다 .The new modifier does nothing more than suppress the compiler warning that would otherwise result
override
다른 구현을 넣을 수 있도록 기본 클래스에서 가상 메서드를 재정의 할 수 있습니다. new
기본 클래스에서 가상이 아닌 메서드를 숨 깁니다.
'Nice programing' 카테고리의 다른 글
Android의 WebView에서 JavaScript에서 반환 값을 얻는 방법은 무엇입니까? (0) | 2020.10.31 |
---|---|
무한 스크롤 jquery 플러그인 (0) | 2020.10.31 |
Node.js console.log 대 console.info (0) | 2020.10.31 |
릴리스를 하나의 JAR 파일로 병합하는 가장 쉬운 방법 (0) | 2020.10.31 |
'관리자 권한으로 실행'시 Windows 배치 파일 시작 디렉터리 (0) | 2020.10.31 |