2012-12-09 4 views
2

Java에서 인터페이스를 이해하려고하고 있으며이 작업을 스택으로 사용하려고합니다. 그것은 쉬운 일이 틀림 없지만 그 해결책을 보지 않는 것 같습니다. 인터페이스에는 몇개의 메소드가 포함되어 있습니다. 그 중 1 개 (살)은, 세트의 모든 요소가 세트 내에있는 경우에 true를 돌려줍니다. 나는.유형 이름으로 인터페이스 이름

public interface ISet{ 
//some methods 
    boolean isSubsetOf(ISet x); 
} 

그런 클래스 : 나는 방법 본문에 작성해야하는 일

public class myClass implements ISet{ 
     ArrayList<Integer> mySet; 
     public myClass{ 
      mySet = new ArrayList<Integer>(); 
     } 
     //some methods 
     public boolean isSubsetOf(ISet x){ 
      //method body 
    } 
} 

? myClass의 인스턴스가 ISet 컬렉션의 하위 집합인지 어떻게 확인합니까? 나는 캐스팅을 시도했지만, 그것은 오류가 제공합니다

ArrayList<Integer> param = (ArrayList<Integer>)x; 
    return param.containsAll(mySet); 

답변

0

인터페이스는 클래스의 생각처럼처럼 당신이 할 수있는 다형성의 도움을 witn의.

메서드 정의와 정적 변수 및 최종 변수와 같은 항목이 포함되어 있습니다.

따라서 구현하는 모든 클래스에는 본문 (즉,이 클래스에서 해당 메소드를 처리하는 방법)이 포함됩니다.

예 :

public interface ISet{ 
    boolean isSubsetOf(ISet x); 
} 

이제 구현하는 모든 클래스는 isSubsetOf 메서드를 "처리"하고 부울을 반환합니다. 그들이하는 일은 인터페이스 비즈니스가 아닙니다. 이제 클래스

public class myClass implements ISet{ 
    ArrayList<Integer> mySet; 
    public myClass(){ 
     mySet = new ArrayList<Integer>(); 
    } 

    public boolean isSubsetOf(ISet x){ 
     //you now have to get what type of object x is 
     // it is obviously implementing ISet therefore it most probably be myClass. 
     //So when you typecast the object it should typecast to myClass. 
     ArrayList<Integer> param = (ArrayList<Integer>)(((myClass)x).mySet); 
     return param.containsAll(mySet) 
    } 
} 

우리가 위해 ArrayList x.mySet을 캐스트와 myClass가 자신을 X로이 작동합니다.

그러나 로직에 결함이 있습니다. ISet을 구현하는 다른 클래스가 있으면 myClass로 타입 변환하지 않을 수도 있지만이 경우에는 구현시 잘됩니다. 당신은 내가

myClass A=new myClass(); 
A.add(1); A.add(2); A.add(3); 
myClass B=new myClass(); 
B.add(3); B.add(1); B.add(2); B.add(4); 
A.isSubsetOf(B); 
//This will answer true 
+0

예,이 완벽하게 작동, 코드의 두 라인 - 위대한. – etilia

+0

문제 없습니다. 나는 당신이 그 개념을 이해하기를 바란다. – cjds

0

How do I check that the instance of myClass is a subset of ISet collection

사용 instanceOf :

if(myClass instanceOf ISet){...}

0

인터페이스는 인터페이스 (기능 (들) 프로토 타입 (정의하는 클래스를 s))는 다른 클래스와 공유하는 클래스입니다. 인터페이스의 인스턴스는 없지만 구체적인 클래스의 인스턴스는 없습니다. 예를 들어 ISet iset = new myClass()은 myClass (concrete) 인스턴스를 만들었지 만 ISet 유형의 변수는 참조를 보유하고 있음을 나타냅니다. 이것은 가능합니다 polymarphism 때문에. myClassISet에 의해 제공되는 프로토 타입의 정의를 제공하기 때문에. 다형성의 도움으로 iset.isSubsetOf(...) 만 호출 할 수 있습니다. ISet에는 단 하나의 프로토 타입이 있기 때문입니다.

마찬가지로 그

ISet set1 = new myClass() 
ISet set2 = new myClass() 

set1.isSubsetOf(set2); 
0

가 해결 것을 추가 할 것입니다 그래서이 방법을 실행하는 방법에 대해 혼란스러워하는 것처럼

는 또한 같다. 문제는 Integers의 ArrayList에 있습니다. 실제로는 적합하지 않은 containsAll() 메서드를 사용하려고했습니다. 하위 집합의 각 요소가 주 집합에서 발견 될 수 있는지 확인하기 위해 루프를 사용했습니다. 그리고 별도의 find 메소드는 단일 요소를 찾습니다.

public boolean isSubsetOf(ISet x){ 
    myClass set = (myClass)x; 
    boolean found = false; 
    for (int element : mySet){ 
     found = false; 
     if (set.find(element)){ 
      found = true; 
     } 
    } 
    return found; 

}