리팩토링을 수행하는 동안 아래 예제와 같은 메서드를 생성했습니다. 단순성을 위해 데이터 유형이 변경되었습니다.
이전에 다음과 같은 할당 문이있었습니다.
MyObject myVar = new MyObject();
이것은 우연히 리팩토링되었습니다.
private static new MyObject CreateSomething()
{
return new MyObject{"Something New"};
}
이것은 내 부분에서 잘라 내기 / 붙여 넣기 오류의 결과 였지만 new
in 키워드 private static new
가 유효하고 컴파일됩니다.
질문 : new
키워드는 메소드 서명에서 무엇을 의미합니까? 나는 그것이 C # 3.0에서 도입 된 것이라고 가정합니까?
이것이 어떻게 다른 override
가요?
답변
MSDN의 새로운 키워드 참조 :
다음은 인터넷에서 찾은 Microsoft MVP의 좋은 예입니다.
Link to Original
public class A
{
public virtual void One();
public void Two();
}
public class B : A
{
public override void One();
public new void Two();
}
B b = new B();
A a = b as A;
a.One(); // Calls implementation in B
a.Two(); // Calls implementation in A
b.One(); // Calls implementation in B
b.Two(); // Calls implementation in B
재정의는 매우 특정한 경우에만 사용할 수 있습니다. MSDN에서 :
비가 상 또는 정적 메서드는 재정의 할 수 없습니다. 재정의 된 기본 메서드는 가상, 추상 또는 재정의 여야합니다.
따라서 비가 상 및 정적 메서드를 ‘재정의’하려면 ‘new’키워드가 필요합니다.
답변
아니, 사실 “새로운”것이 아닙니다 (말장난을 용서하십시오). 기본적으로 메서드를 “숨기기”에 사용됩니다. IE :
public class Base
{
public virtual void Method(){}
}
public class Derived : Base
{
public new void Method(){}
}
그런 다음 이렇게하면 :
Base b = new Derived();
b.Method();
Base의 메서드는 파생 된 메서드가 아니라 호출 될 메서드입니다.
추가 정보 : http://www.akadia.com/services/dotnet_polymorphism.html
다시 편집하십시오 . 내가 준 예제에서 “new”를 사용하는 대신 “재정의”하려면 b.Method (); Derived 클래스의 Method는 Polymorphism 때문에 호출됩니다.
답변
다른 사람들이 설명했듯이 기존 메서드를 숨기는 데 사용됩니다. 부모 클래스에서 가상이 아닌 메서드를 재정의하는 데 유용합니다.
“새”멤버를 만드는 것은 다형성이 아닙니다. 개체를 기본 형식으로 캐스팅하면 파생 형식의 멤버를 사용하지 않습니다.
기본 클래스가있는 경우 :
public class BaseClass
{
public void DoSomething() { }
}
그리고 파생 클래스 :
public class DerivedType : BaseClass
{
public new void DoSomething() {}
}
유형을 선언 한 DerivedType
다음 캐스트하면 메서드 DoSomething()
는 다형성이 아니며 파생 된 메서드가 아닌 기본 클래스의 메서드를 호출합니다.
BaseClass t = new DerivedType();
t.DoSomething();// Calls the "DoSomething()" method of the base class.
답변
문서에서 :
파생 클래스의 메서드 앞에 new 키워드가있는 경우 메서드는 기본 클래스의 메서드와 독립적 인 것으로 정의됩니다.
이것이 실제로 의미하는 바 :
다른 클래스에서 상속하고 동일한 서명을 공유하는 메서드가있는 경우이를 ‘new’로 정의하여 부모 클래스와 독립적으로 만들 수 있습니다. 즉, ‘부모’클래스에 대한 참조가 있으면 해당 구현이 실행되고, 하위 클래스에 대한 참조가 있으면 해당 구현이 실행됩니다.
개인적으로 ‘new’키워드는 일반적으로 내 클래스 계층 구조가 잘못되었음을 의미하므로 피하려고하지만 유용 할 수있는 경우가 있습니다. 한 곳은 버전 관리 및 이전 버전과의 호환성입니다.
이에 대한 MSDN 에는 많은 정보가 있습니다.
답변
이는 메서드가 기본 클래스에서 상속 한 동일한 이름으로 메서드를 대체 함을 의미합니다. 귀하의 경우에는 기본 클래스에 해당 이름의 메서드가 없을 것입니다. 즉, 새 키워드가 완전히 불필요합니다.
답변
짧게 말하면 필수 사항이 아니며 동작을 변경하지 않으며 가독성을 위해 순전히 있습니다.
그렇기 때문에 VS에서 약간 구불 구불하게 보일 수 있지만 코드는 예상대로 완벽하게 잘 컴파일되고 실행됩니다.
new
개발자가 “예, 기본 메서드를 숨기고 있다는 것을 알고 있습니다. 예, virtual
or overriden
(다형성) 와 관련된 작업을 수행하지 않는다는 것을 알고 있습니다.”라고 인정하는 경우 키워드를 만드는 것이 정말 가치가 있는지 궁금해해야합니다. 나는 정말로 그것만의 방법을 만들고 싶다. “
그것은 나에게 조금 이상한,하지만 어쩌면 단지 난에서 온 때문에 Java
배경 사이의 근본적인 차이가있어 C#
상속과는 Java
:에서가 Java
지정하지 않는 한 방법이 기본적으로 가상 있습니다 final
. 에서가 C#
지정하지 않는 한 방법은 기본적으로 최종 / 콘크리트입니다 virtual
.
답변
에서 MSDN :
new 한정자를 사용하여 기본 클래스에서 상속 된 멤버를 명시 적으로 숨 깁니다. 상속 된 멤버를 숨기려면 동일한 이름을 사용하여 파생 클래스에서 선언하고 새 수정 자로 수정합니다.