2012-05-28 8 views
1

저는 arraylists를 사용하는 자바 프로그램을 가지고 있습니다.이 arraylists는 '변수'가 추상 클래스 인 '변수'를 저장합니다.추상 클래스를 인터페이스로 변환하려면 어떻게해야합니까?

이제 메모리를 절약하기 위해 HugeCollections-VanillaJava라는 Java 라이브러리를 사용하고 싶습니다. 그러나이 라이브러리는 인터페이스를 정의해야합니다.

어떻게 추상 클래스를 인터페이스로 변환합니까? 전환을 올바르게 수행하기 위해 따라야하는 규칙/제한 사항은 무엇입니까?

마지막으로 인터페이스를 필요로하는 라이브러리가 올바르게 작동하도록 최소한의 코드 변경으로 추상 클래스를 사용할 수 있습니까? 이상적으로는 추상적 인 수업을 전혀 바꾸지 않으려 고합니다 ... 가능합니까?

+2

일부 코드를 보여 주시겠습니까? 귀하의 질문은 약간 혼란 스럽습니다. – Jeremy

답변

5

추상 클래스를 인터페이스로 변환하려면 어떻게해야합니까?

  1. 는 추상 클래스 소스 파일의 복사본을 만듭니다.

  2. 초기 선언에서 "class"를 "interface"로 변경하십시오.

  3. 이름을 변경하십시오 (선택 사항, 수행중인 작업에 따라 다름).

  4. 클래스에 의해 구현 된 메서드의 본문을 제거하십시오.

  5. "추상"이라는 단어는 다른 단어에서 제거하십시오.

  6. 모든 개인 및 보호 된 구성원을 제거하십시오.

  7. 모든 생성자를 제거하십시오.

  8. 공개 회원으로부터 키워드 "public"을 삭제하십시오.

제거한 코드 (메소드, 개인 또는 보호 된 메소드 구현)가 있다면 원래의 추상 클래스에서 인터페이스를 구현하고 거기에 남겨 둡니다.

(불완전한) 예 : 추상 클래스와

Foo : 인터페이스로

public abstact class Foo 
{ 
    private int bar; 

    public static final int SOME_CONSTANT = 42; 

    public Foo(b) { 
     this.bar = b; 
    } 

    public abstract void doSomething(String s); 

    protected int doSomethingElse() { 
     return this.bar * 2; 
    } 
} 

Foo : 내 경우

public interface Foo 
{ 
    int SOME_CONSTANT = 42; 

    void doSomething(String s); 
} 

, 나는 몇 가지 물건 구가했던 것처럼 Foo 않았다면, 아마도 AbstractFoo 또는 뭔가 :

... 원하는 경우 구현을 시작점으로 사용할 수 있습니다. (privatebar이 있지만 그다지 의미가 없습니다.)

+0

@JBNizet : 감사합니다! 끝난. –

1

추상 클래스가 구체적인 메소드를 정의하지 않으면 정규 표현식을 사용할 수도 있습니다. 올린 사람 :

public abstract class Abstract { 
    public abstract void method(); 
    //... 
} 

에 :

public interface Interface { 
    void method(); 
    //... 
} 

public abstract 수정이 인터페이스에 대한 암시이다. abstract 클래스 일 경우 일부 메소드를 정의하거나 (모든 메소드가 abstract이 아님) 일부 필드가 있으면 (적어도 쉽게) 수행 할 수 없습니다.

+0

추상 클래스의 속성에 대해 잊지 마세요 –

+0

@LuiggiMendoza : 감사합니다, 내 대답에 이것을 추가했습니다 –

2

패턴 Adapter 당신을 도울 수 있습니다.

TargetInterface

public abstract class SomeClass { 
     // some code here 
    public abstract void someMethod(); 
} 

public interface TargetInterface { 
    public void someMethodBlaBla(); 
} 

SomeClass을 사용해야하고, 상상 그리고 그들은 방법의 다른 서명이 - 것으로 someMethod()someMethodBlaBla()를. 그래서

당신은 어댑터 클래스 만들 수 있습니다 위치 :

public class Adapter implements TargetInterface { 
    private SomeClass adaptee; 

    public Adapter(SomeClass adaptee) { 
     this.adaptee = adaptee; 
    } 

    public void someMethodBlaBla() { 
     this.adaptee.someMethod(); 
    } 

    //delegate all calls to adaptee 
} 

을 어딘가에 코드에서 당신은 둘 다 사용할 수 있습니다 - 현재 코드에 간섭없이 어댑터와 추상 클래스의 인스턴스를, :

SomeClass abstractClassInstance = ... //get instance of your abstract class 
TargetInterface targetInterfaceInstance = new Adapter(abstractClassInstance); 
관련 문제