Nice programing

C #에서 재정의와 새 키워드의 차이점은 무엇입니까?

nicepro 2020. 10. 31. 10:08
반응형

C #에서 재정의와 새 키워드의 차이점은 무엇입니까?


클래스 계층 구조에서 메서드를 정의 할 때 C #에서 overridenew키워드 의 차이점은 무엇입니까 ?


다음 페이지는 귀하의 질문을 매우 잘 요약합니다.

재정의 및 새 키워드 사용시기 파악

요약

재정의 : 파생 클래스에서 기본 클래스의 메서드를 재정의하면 호출 코드가 개체가 파생 클래스의 인스턴스라는 것을 "인식"하지 않은 경우에도 파생 클래스의 버전이 사용됩니다.

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. 다른 것으로 인식 될 수있는 이름으로 메서드를 정의하고 있기 때문에 기껏해야 혼란 스럽습니다. 최악의 경우 실수를 숨기고 불가능 해 보이는 버그를 도입하고 기능 확장을 어렵게 만들 수 있습니다.


오래된 질문 인 것 같습니다. 다른 답변을 시도해 보겠습니다.

  1. new : 이름에서 알 수 있듯이 상속 계층 구조의 새 구성원이며 체인 아래에있는 기본 구성원으로 사용됩니다 (가상으로 표시된 경우).

  2. 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기본 클래스에서 가상이 아닌 메서드를 숨 깁니다.

참고URL : https://stackoverflow.com/questions/6576206/what-is-the-difference-between-the-override-and-new-keywords-in-c

반응형