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 |