2014-08-28 5 views
0

어떻게 클래스에서 구현 된 인터페이스 메서드가 인스턴스화되지 않도록 할 수 있습니까?메서드가 인스턴스화되지 않도록하는 방법

public interface Interface1 
{ 
    void Show(); 
} 

public class ABC : Interface1 
    { 

     public void Show() 
     { 
      // any thing 
     console.WriteLine(:Hello"); 
     } 

    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      ABC a = new ABC(); 

     } 
    } 

여기 프로그램 클래스에서는이 메서드에 액세스하지 않으려합니다.

+1

그냥 빈 방법으로 사용 하시겠습니까? (던지기를 제거하십시오) 그때 그것의 불리는 경우에 상관 없습니다 - 그렇지 않으면 그 모두가 공용 영역에있는 경우에, 다만 ABC에는 공용 영역을 실행하지 말라 – Sayse

+0

미안하지만, "나는이 방법에 접근을 만들고 싶지 않다" 나에게 어떤 의미가 없지? 너의 문제는 무엇인가? – Mithrandir

+0

@ Susay 나는 Program 클래스로 만든 ABC 인스턴스에서이 메서드를 호출하고 싶지 않습니다. – IMMORTAL

답변

4

당신이 정말로 유일한 방법은 인터페이스 타입의 표현을 통해 사용할 수 원하는 경우, explicit interface implementation를 사용할 수 있습니다

void Interface1.Show() 
{ 
    throw new NotImplementedException(); 
} 

당신은 완전히 비록 전화의 가능성을 제거 할 수 없습니다 -이 명확 것 ABC이 인터페이스를 구현한다는 사실을 깨십시오. 실제로, 으로가는 것이 아니라면은 전체 인터페이스를 구현해야합니다. 은 인터페이스를 구현한다고 선언해야합니다.. 위와 같이 명시 적 인터페이스 구현

: 우리가 가진 것 :

ABC abc = new ABC(); 
abc.Show(); // Error 
Interface1 iface = abc; 
iface.Show(); // Fine at compile time; will throw your NotImplementedException 
2

대답은 당신이 할 수없는

인터페이스가 인스턴스 메소드로 모두 구현해야 구현하는 클래스입니다. 그것이 인터페이스가 클래스에 대한 계약으로서 디자인에 의해 사용되는 방법입니다.

정적 메서드를 사용하려는 경우 전역 고정 구현이 하나만 있으므로 계약을 유지하는 데 인터페이스가 필요하지 않습니다.

희망이 있습니다.

1

다른 클래스가 메소드를보고 호출하지 못하도록하려면 해당 클래스를 비공개로 표시하십시오.

그러나 인터페이스 메서드는 정의에 따라 정의되어 있으므로 인터페이스를 구현하는 데 사용할 수 없습니다.

또한 메서드를 private으로 설정하고 호출 코드에 충분한 권한 (동일한 어셈블리)이 있으면 호출자는 여전히 Reflection을 사용하여 메서드를 호출 할 수 있습니다.

메서드 내에서 호출 스택을 호출하여 호출되는 위치를 확인하고 호출자가 마음에 들었는지와 메서드의 바로 가기 또는 예외가 아닌 경우 예외를 throw 할 수 있습니다.

하지만 실제 요구 사항은 무엇입니까? 기본 이슈 데이터 보안이 있습니까? 이 방법은 위험한 일 (데이터 손상 가능성 또는 잘못된 시간 등에 원자로에서 냉각 봉을 추출 할 가능성)을 수행합니까?

요구 사항을 이해하면 올바른 해결책을 결정하는 데 도움이됩니다.

관련 문제