2012-05-10 2 views
1

다음 코드를 실행하려고하면 오류가 발생합니다.봉인 된 클래스에서 본문이없는 가상 메서드

private sealed class ReqHandler 
{ 
    public ReqHandler(object @object, IntPtr method); 

    public virtual IAsyncResult BeginInvoke(object[] args, AsyncCallback callback, object @object); 

    public virtual d0 EndInvoke(IAsyncResult result); 

    public virtual d0 Invoke(object[] args); 
} 

내가 얻는 오류는 있습니다.

HB_Auth.AuthImpl.ReqHandler.ReqHandler(object, IntPtr)' must have a body because it is not marked abstract, extern, or partial (CS0501) (HB_Auth.Patched)

New virtual member HB_Auth.AuthImpl.ReqHandler.BeginInvoke(object[], AsyncCallback, object)' is declared in a sealed class HB_Auth.AuthImpl.ReqHandler' (CS0549) (HB_Auth.Patched)

+0

무엇을하려고합니까? – gdoron

+1

C#은 C++이 아닙니다. C#에서는 구현이 클래스 선언으로 넘어갑니다. – Vlad

+0

두 가지 문제 : 가상 메소드에는 여전히 구현이 필요하며 봉인 된 클래스에는 가상 멤버가있을 수 없습니다. – Siege

답변

3
  • 당신은 봉인 클래스에서 가상 멤버를 가질 수 없습니다.

CS0549 오류 :

CS0501 오류 :

A sealed class cannot be used as a base class, and a virtual method has to be implemented in a derived class, which is a contradiction.

MSDN

  • 이 기능이 구현 될 필요가

    Non abstract methods must have implementations.

    MSDN

    당신은 아마 클래스 protected을 만들고 싶어하고, virtual 기능 abstract

+0

그러면 더 많은 오류가 발생했습니다. – user1388129

+0

@ user1388129. 너 뭐하려고? C# 추상 자습서로 인터넷 검색이 도움이 될 것 같습니다. – gdoron

4

컴파일러 오류가 모두 그것을 말한다 : 당신은 방법을 선언했지만, 그들은 몸이없는 . 그래서, 그들에게 몸을 주거나, 추상적으로 표시하십시오. 그러나 클래스가 비공개이고 봉인 된 것으로 보아 클래스를 봉인 한 것처럼 추상화하면 아무 것도 할 수 없으므로 아무도 클래스를 상속 할 수 없습니다.

하지만 붙여 넣은 코드는 디 컴파일 된 코드처럼 보입니까?

+1

내 메모리 스틱을 잃어 버렸을 때 소스 파일의 일부분을 잃어 버렸기 때문에이 모든 것이 디 컴파일 된 것입니다 – user1388129

1

첫 번째 문제 : 생성자에는 시체가 필요합니다. 생성자를 선언 할 수는 없으며 정의해야합니다. 원하는 경우 빈 생성자를 사용할 수 있습니다.

public ReqHandler(object @object, IntPtr method) {} 

두 번째 문제 : 봉인 된 클래스를 만들었지 만 가상 메서드가 있습니다. 가상 메소드는이 클래스를 확장하는 클래스에서 재정의하기 위해 단독으로 존재하지만 봉인 된 클래스를 확장 할 수 없으므로 오류가 발생합니다. 이러한 메소드를 정의하거나 클래스의 봉인을 해제해야합니다 (어떤 경우에도 유용하게 사용할 수 있도록 확장해야합니다).

+0

(힌트 피킹) 가상 메소드가 후기 바인딩에 대한 _possibility_를 위해 존재합니다. 즉, 덮어 쓸 가능성이 있습니다. 드레 이브 된 클래스가 그것들을 오버라이드하지 않습니다. – Vlad

+1

@Vlad True. 그러나 봉인 된 클래스가없는 가능성은 여전히 ​​존재해야합니다. 젠장. ; P –

+0

http://stackoverflow.com/questions/155087/how-can-you-inherit-from-a-sealed-class-using-reflection-in-net Research says ... "당신은 할 수 있습니다. 가상 클래스를 기본 클래스에 삽입하여 가상 클래스 멤버를 숨긴다. " – Jay