将接口与没有源访问的类关联

时间:2017-09-29 17:03:26

标签: java inheritance interface

这是问题,我有两个绘图JAR库(A和B)。两者都提供单独但有用的功能。然而,在他们无限的智慧中,他们有两个不同的基本点类概念。

既没有任何有趣或特别独特的方法或领域,也基本归结为:

public class PointA{
   double x;
   double y;
}

public class PointB{
   double x;
   double y;
}

这些库中的函数具有如下所示的方法:

public static List<PointA> doInterestingThing();

public static PointB calculateThatThing();

我觉得应该有一些很好的方法来理解这两个类是针对所有意图的,同样的。

如果我有源访问权限,我可以让它们实现一些IPoint接口,但这两个库都在JARS中。

我看到它的方式有几种选择:

  1. 将一个转换为另一个。要么使函数将所有PointA转换为PointB,反之亦然。这意味着基本上在其中一个库上创建一个抽象层,方法是用一些样板转换代码包装其中的每个函数。

    public static List<PointA>doInterestingThingWrapper(){
        return convertPoints(LibraryB.doInterestingThing()); 
    }
    
  2. 制作一些第三类 PointC,将两个库的结果转换为代表我的代码对点的理解。与上面相同的问题,但现在我需要写两次样板转换!

  3. 直接编辑JARS 。显然这不是优选的。但是,它允许我使PointA和PointB实现相同的接口。

  4. 一些神奇的动态界面互动我不知道。 可能是Java有一些方法可以动态地为已经加载的类分配接口吗?

  5. 类似的东西:

    public interface IPoint{
       double getX();
       double getY();
    }
    
    public static void main(){
        //Magical made up linking syntax
        PointA implements IPoint{
            public getX(){
               this.getX()//PointA's method
            }
            public getY(){
               this.getY(){//pointA's method
            }
        }
        //And same for pointB
    
        //And now we can say things like:
        List<? extends IPoint> listOPoints=A.doInterestingThing();
        //and:
        IPoint thePoint=B.calculateThatThing();  
    }
    

    如果这是重复,我会提前道歉。我甚至不知道该怎么称呼这个让搜索变得困难的问题。如果我错过了一些明显的设计模式(适配器模式?)解决了这个问题,请告诉我。

1 个答案:

答案 0 :(得分:-1)

你有两个解决方案

使用反射和非反射来使用相同的命名函数。

将项目代码中的两个包装到实现接口的对象中。

样品:

class A { public void d(){}}
class B { public void d(){}}
interface D { void d(); }
class AD extends A implements D {}
class BD extends B implements D {}

class AD implements D {A obj = new A(); public void d(){obj.d();}}