如何将抽象类转换为接口?

时间:2012-05-28 14:59:19

标签: java interface abstract-class

我有一个使用arraylists的java程序 - 这些arraylists存储'变量',其中'variables'是一个抽象类。

现在,为了节省内存,我想使用一个名为HugeCollections-VanillaJava的java库 - 但是这个库需要定义一个接口。

如何将抽象类转换为接口?为了正确执行转换,我必须遵循哪些规则/限制?

最后,我是否可以使用最少代码更改的抽象类,以便需要接口的库也能正常工作?理想情况下,我根本不想改变抽象类......这可能吗?

3 个答案:

答案 0 :(得分:6)

  

如何将抽象类转换为接口?

  1. 制作抽象类源文件的副本。

  2. 在初始声明中将“class”更改为“interface”。

  3. 更改名称(可选,取决于您正在做什么)。

  4. 删除该类实现的任何方法的主体。

  5. 从其他单词中删除“abstract”一词。

  6. 删除所有私人和受保护的成员。

  7. 删除所有构造函数。

  8. 从公共成员中删除关键字“public”。

  9. 如果您删除了任何代码(已实现的方法,私有或受保护的东西),请让原始的抽象类实现您的界面并将其留在那里。

    (Incomplete)示例:

    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或其他东西:

    public abstact class AbstractFoo implements Foo
    {
        private int bar;
    
        public Foo(b) {
            this.bar = b;
        }
    
        public abstract void doSomething(String s);
    
        protected int doSomethingElse() {
            return this.bar * 2;
        }
    }
    

    ...因此,如果需要,实现可以将其用作起点(虽然在那里使用private bar,但它没有多大意义。)

答案 1 :(得分:3)

模式Adapter可能会对您有所帮助。

想象一下,你必须使用 SomeClass 作为 TargetInterface

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

public interface TargetInterface {
     public void someMethodBlaBla();
}

他们有不同的方法签名 - 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 );

答案 2 :(得分:0)

如果抽象类没有定义任何具体方法,你甚至可以使用正则表达式。从:

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

为:

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

public abstract修饰符是接口隐式的。如果abstract确实定义了一些方法(并非所有方法都是abstract)或者有一些字段,则无法完成(至少很容易)。