2014-09-13 3 views
0

C# 또는 Java에서 구현 된 인터페이스로만 인스턴스화 할 수있는 클래스를 어떻게 만들 수 있습니까?인터페이스를 통해서만 액세스 할 수있는 클래스를 만드는 방법은 무엇입니까?

죄송합니다. 이전에이 질문이있는 경우 죄송합니다.

편집 : 당신을 혼란 죄송합니다,이 질문은 단지 호기심에서 질문한다 : 예를 들어

내가 가진 :

interface iA 
{ 
    int addNum(); 
} 

interface iB 
{ 
    int minusNum(); 
} 

class A implements iA, iB 
{ 
    private int A; 
    public int addNum() 
    { 
    A += 10; 
    return A; 
    } 

    public int minusNum() 
    { 
    A -= 10; 
    return A; 
    } 
} 

class TestIface 
{ 
    public static void main(String args[]) { 
    A testA = new A(); 
    iA testiA = new A(); 
    iB testiB = new A(); 

    testA.minusNum(); // No error, it has access to both methods 
    testA.addNum(); 

    testiA.minusNum();//ERROR 
    testiA.addNum(); 

    testiB.minusNum(); 
    testiB.addNum();//ERROR 
    } 
} 

난 그냥 만들어에서 dev에 방지하는 방법이 있는지 궁금합니다 testA를 실행하고 두 메소드에 액세스하십시오.

+0

그런 것은 존재하지 않습니다. –

+0

가능한 복제본 [Java 인터페이스는 실제로 어떻게 사용됩니까?] (http://stackoverflow.com/questions/504904/how-are-java-interfaces-actually-used) – user23123412

+2

이렇게하면 무엇을 얻게됩니까? –

답변

1

생성자를 비공개로 만들고 새 인스턴스를 만드는 정적 Create 메서드를 정의 할 수 있습니다.

public interface ITest 
    { 
    } 
    public class A : ITest 
    { 
     private A() 
     { 
     } 
     public static ITest Create() 
     { 
      return new A(); 
     } 
    } 
다음

클래스의 인스턴스를 생성 할 수있는 유일한 방법 (! 반사 외에,하지만 그건 또 다른 이야기)이이 같은 Create 메서드 호출하는 것입니다 :

ITest test = A.Create(); 
+0

그래서, 왜 안 : 테스트 = A. 생성(), 테스트는 여전히 대부분의 방법에 대한 액세스 권한을 얻을 것인가? – Tr1et

+0

컴파일 오류가 발생하므로이를 수행 할 수 없습니다. A.Create() 결과를 A의 인스턴스로 사용하는 유일한 방법은 명시 적 형변환을 사용하는 것입니다. – brz

+0

@ Tr1et 발신자는'A.Create'가'ITest'의 인스턴스를 반환한다는 것을 알고 있기 때문에. A.Create의 구현이 실제로 A의 인스턴스를 리턴한다는 것은 메소드 서명이 표시된 구현 세부 사항입니다. –

3

생성자를 비공개로 만드는 것은 어떻습니까?

class A implements iA 
{ 
    public int returnNum() 
    { 
    return 10; 
    } 
    private A(){} 

    public static iA getInstance(){ 
    return new A(); 
    } 

} 
+1

게시 된 코드는 쓸모가 없습니다 (정적 인 getInstance를 만들지 않는 한) –

+0

나는 그것을 편집하고있었습니다. 어쨌든 그것을 지적 해 주셔서 감사합니다 :) – zerocool

+0

이것은 누군가가 인터페이스의 또 다른 구체적인 구현을 생성하는 것을 막지 못합니다 따라서 public 생성자를 사용하므로 OP의 (불가능한) 요구 사항을 채우지 못합니다. –

0

을 할 수 있습니다하지 인스턴스화 뭔가 인터페이스를 통해 인터페이스로만 선언 할 수 있습니다. 당신의 목표는 iB 통해서만 접근 할 수 iAminusNum을 통해서만 접근 할 수 addNum을하는 경우, (그것의 자신의 단점을 가지고 있지만) 당신은 명시 적 인터페이스 구현을 시도 할 수 있습니다 :

class A : iA, iB 
{ 
    private int A; 

    int iA.addNum() 
    { 
     A += 10; 
     return A; 
    } 

    int iB.minusNum() 
    { 
     A -= 10; 
     return A; 
    } 
} 

이 적어도 당신에게 컴파일 시간 효과를 줄 것이다 당신이 찾고 있습니다 :

class TestIface 
{ 
    public static void main(String args[]) { 

     A testA = new A(); 
     testA.minusNum(); // does not compile 
     testA.addNum(); // does not compile 

     iA testiA = new A(); 
     testiA.minusNum();//does not compile 
     testiA.addNum(); 

     iB testiB = new A(); 
     testiB.minusNum(); 
     testiB.addNum();//does not compile 
    } 
} 

그러나,이 addNumiA을 선언하는 변수를 통해서만 액세스 할 수있는 것은 아닙니다. 설명하기 위해, 당신은 할 수 있습니다 :

A testObj = new A(); 
(testObj as iA).addNum(); // this will compile 

당신도 할 수 있습니다 : 당신이 더에서 콘크리트 클래스에 명시 적 캐스팅을 방지하려면

iB testObj = new A(); 
(testObj as iA).addNum(); // this will also compile, and execute fine 

, 당신은 조언 등을해야 할 필요가 제공 한 것은이 아직도 내가 생각하는 IA와 IB 사이에서 캐스팅을 방지하지 않습니다

class Factory 
{ 
    private class A : iA, iB 
    { 
     int iA.addNum() {...} 
     int iB.minusNum() {...} 
    } 

    public iA GetInstanceOfiA() 
    { 
     return new A(); 
    } 

    public iB GetInstanceOfiB() 
    { 
     return new A(); 
    } 
} 

: 당신의 구상 클래스 중첩 된 개인 클래스하고 인스턴스를 생산하는 공장을 소개 당신은 수용 할 두 개의 분리 된 구체적인 클래스를 생성해야합니다.

+0

고맙습니다. iA.addNum()과 같은 메소드를 작성할 수 있다는 사실에 놀라움을 금치 못합니다. Java 만 사용 가능하거나 C#에서도 사용할 수 있습니까? – Tr1et

+0

그것은 C# 특정입니다. StackOverflow 또는 Goggle에서 "명시 적 인터페이스 구현"을 검색하면 많은 예제가 제공됩니다. – Xinchao

관련 문제