2014-10-29 3 views
0

오류 1 'Interface.myDerivedClass.myMethod()': 가상 또는 추상 멤버는 개인 c : \ 사용자 \ igmfun \ documents \ visual studio 2012 \ Projects \ Interface \ Interface \ Program.cs 16가상 또는 추상적이지 않은 메소드로 인해 "C# 가상 또는 추상 멤버가 비공개가 될 수 없음"

가상 또는 추상 멤버를 비공개로 설정하면 파생 클래스를 비롯한 다른 클래스에서 액세스 할 수 없으므로 메서드를 재정의하거나 가상 또는 추상을 만들 수 없습니다 의미없는 품질. 알 겠어.

기다려 ... 컴파일러가 기본 클래스가 아닌 파생 클래스의 멤버에 대해 불평하고 있습니다. 그리고 멤버를 가상 또는 추상으로 선언하지 않았습니다 ... 따라서 무시 멤버 (파생 클래스)는 재정의하는 가상 또는 추상 멤버로부터 가상 또는 추상적 품질을 상속 받습니까?

또한 "override void myMethod() {}"를 "public override void myMethod() {}"로 변경하면 "적합한 메소드를 찾지 못했습니다."라는 새로운 오류가 나타납니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Interface 
{ 
    interface myInterface 
    { 
     void myMethod(); 
    } 

    class myDerivedClass : myInterface 
    { 
     override void myMethod() 
     { 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 

     } 
    } 
} 
+0

은 인터페이스가 필요로하는 'override' 키워드를 구현합니다. – chengbo

+1

모든 인터페이스 메소드는 public입니다. 파생 클래스의 서명은 public void myMethod() {} 여야합니다. public을 지정하지 않으면 메서드가 파생 클래스에서 private이라고 가정합니다. –

+1

MaxHampton이 암시 하듯이, 당신이 아무 것도 무시하지 않기 때문에'override' 키워드가 필요 없습니다. 기본 클래스에서'virtual' 또는'abstract'로 선언 된 경우에만 무언가를 무효화 할 수 있습니다. 인터페이스 멤버는 오버라이드되지 않고 구현됩니다. – jmcilhinney

답변

2

오류는 다소 오해의 소지가 있습니다. 처음에는 컴파일러가 코드에 대해 로컬로 판단한 것처럼 보입니다. 그래서 당신이 overrideprivate (기본값) 지정자로 사용하고있는 것을 발견했습니다. 이것은 분명히 오류이지만 실제로는 실제 코드를 숨 깁니다. 우선 무시할 것이 없습니다 (코드를 public override void myMethod(){}로 변경하면 볼 수 있습니다).

실제 수정하는 것입니다 방법 public구현 인터페이스 방법 : 당신이 private에 (유사 직접 클래스되지 볼 수 있도록 방법을 선호하는 경우

class MyInterfaceImplementationClass : IMyInterface 
{ 
    public void MyMethod() 
    { 
    } 
} 

은 또한 당신이 너무 인터페이스를 explicitly implement 수 있습니다 하지만 당신은) 인터페이스로 변환하여 호출 할 수 있습니다

class MyExplicitInterfaceImplementationClass : IMyInterface 
{ 
    void IMyInterface.MyMethod() 
    { 
    } 
} 

interface IMyInterface 
{ 
    void MyMethod(); 
} 
1

을 당신이 ClassInterface을 혼동 생각 .

당신은 기본 클래스가 사용에서 class 키워드는 override 당신이 virtual로 표시 할 수있는 기본 클래스의 방법으로 할 수와 override을 사용하려면하지 interface

public class BaseClass 
{ 
    public void MyMethod() 
    { 

    } 
} 

public class DerivedClass : BaseClass 
{ 

} 

을 유도하려는 경우 파생 클래스의 키워드

public class BaseClass 
{ 
    public virtual void MyMethod() 
    { 

    } 
} 

public class DerivedClass : BaseClass 
{ 
    public override void MyMethod() 
    { 
     // do soothing different 
     base.MyMethod() 
    } 
}