2012-01-18 4 views
3

C#의 새로운 기능입니다. 인터페이스 기능을 연구하려고합니다. 인터페이스에 대해 읽은 기사와 노트를 기반으로 필자는 노트와 기사에서 이해 한 것을 기반으로 인터페이스를 구현하기위한 샘플 코드를 작성하려고했습니다. 내가 빌드 오류C#의 인터페이스 문제

을 가지고 프로젝트를 디버깅 할 때

는 그러나 "일관성 접근성 : 매개 변수 유형 'StartMachine는'방법 'SwitchBoard.switchPress (StartMachine)'보다 액세스 할 수 있습니다."

여기에 어떤 문제가 있습니까? 또는 올바른 방법으로 인터페이스를 구현 했습니까? 또는 인터페이스에 대한 내 개념이 잘못 되었습니까? ...

도와주세요. 미리 감사드립니다.

나는 아래 코드를 게시했다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     StartMachine s1 = new Machine1(); 
     SwitchBoard switch1 = new SwitchBoard(); 
     switch1.switchPress(s1); 
    } 
} 

interface StartMachine 
{ 
    void startMachine(); 
} 

public class Machine1 : StartMachine 
{ 
    public void startMachine() 
    { 
     HttpContext.Current.Response.Write("Machine 1 Started"); 
    } 
} 

public class Machine2 : StartMachine 
{ 
    public void startMachine() 
    { 
     HttpContext.Current.Response.Write("Machine 2 Started"); 
    } 
} 

public class SwitchBoard 
{ 
    public void switchPress(StartMachine switchNum) 
    { 
     switchNum.startMachine(); 
    } 
} 
+2

인터페이스의 규칙은 대문자 "I"로 시작합니다 ... 실제로이 규칙을 따르면 코드를 훨씬 쉽게 읽을 수 있습니다. 'IStartMachine' –

+0

고맙습니다. 제레미. 나는 앞으로 코드 규약을 따를 것이다. – Arun

답변

8

public 액세스 수정자가 인터페이스 앞에 있어야합니다. Machine1/2 클래스는 public이지만 인터페이스는 기본값이 internal입니다. 이것은 대중보다 접근하기 어렵습니다. 공공 액세스 변경 용으로

설정 인터페이스 : 또는

public interface StartMachine {...} 

, 당신은 할 클래스를 변경할 수 있습니다 : 자세한 내용은

internal class Machine1: StartMachine {...} 
internal class Machine2: StartMachine {...} 

를 액세스 수정에 대해 살펴 MSDN에 있습니다.

수정 : :

Switchboard 클래스와 switchPress 방법은 public이다. 그러나 switchPress 메서드는 internal (기본값)으로 StartMachine.startMachine (우연히 모호한 이름 지정) 메서드에 액세스하려고 시도하고 있습니다. StartMachine 인터페이스를 공개로 변경하거나 Switchboard/switchPressinternal으로 변경해야합니다.

+0

고마워요 제이슨 ... – Arun

4

오류 메시지가 나타나면 메서드와 인터페이스 사이에 "일관성없는 액세스 가능성"이 있다고 생각하십시오. 수정 사항은 간단하며 인터페이스 공개로 표시하십시오.

public interface StartMachine 

당신은 StartMachine을 받아들이는 대중 방법을 가지고, 아직 인터페이스 자체는 대중 표시되지 않았습니다. 외부 코드는 메소드를 볼 수 있지만 적절한 메소드를 제공 할 수는 없습니다.

+0

고마워요 안소니 ... – Arun

2

공개 인터페이스로 설정하십시오.

public interface StartMachine 
{ 
    ... 
} 
+0

고마워요 제레미 .... – Arun

1

다른 사람들이 말했듯이 인터페이스 공개로 표시하십시오. 나는 여기에 혼란이 있다고 생각한다. 모든 인터페이스가 이고, 인터페이스 자체는 자동으로 공개 될 필요는 없다. 라이브러리 내부에서만 사용할 개인 인터페이스를 가질 수 있습니다.

+0

고마워 Joel .... – Arun