Java создать интерфейс оболочки для другого интерфейса - PullRequest
0 голосов
/ 09 августа 2011

Проблема, с которой я сталкиваюсь, такова:

  1. Я использую стороннюю библиотеку, скажем Editor, у которой есть интерфейс, EditorActions , с методами-

    create (), edit (), delete ().

  2. Я не хочу показывать, EditorActions методы в моей реализации.Поэтому мой интерфейс будет иметь такие методы, как -

    myCreate (), myEdit (), myDelete () , которые, в свою очередь, должны вызывать методы EditorActions.

    EditorActions - толькоинтерфейс, реализация является внутренней по отношению к библиотеке.

    Как связать 2 интерфейса, не реализовав ни один из них?

спасибо за вашу помощь

Ответы [ 3 ]

2 голосов
/ 10 августа 2011

Вы можете сделать это, выставив методы, которые вы хотите, чтобы люди использовали в абстрактном классе. А затем вынуждайте людей внедрять конкретные методы, которые вы от них хотите.

Затем вы можете использовать методы из интерфейса EditorActions, а также методы, которые вы заставляете свои реализации реализовать.

public abstract class AbstractEditorActions {

   private EditorActions ea;

   public AbstractEditorActions(EditorActions ea) {
      this.ea = ea;
   }

   // In this method, you can use the methods
   // from the interface and from this abstract class.
   // Make the method final so people don't break
   // the implementation.
   public final void yourExposedMethod() {
      // code
      this.toImplement();
      ea.doMethod();
   }

   protected abstract toImplement();

}
0 голосов
/ 10 августа 2011

Как связать 2 интерфейса без реализации одного из них?

Вы не можете.Вы пытаетесь сделать автоматическую магию здесь.Не твори волшебство.Вы должны реализовать любой из них, несмотря ни на что.

Или вам придется реализовать собственную систему отражения (или AOP каким-либо образом) для создания классов на лету.Последнее не является тривиальным способом, и, как правило, это избыточное убийство и красный флаг чрезмерного инжиниринга, просто чтобы избежать реализации того, что является простым старым делегатом .

OTH, если вытолько хотел «выставить» подмножество методов, предоставляемых сторонним интерфейсом A (скажем, например, только методы получения), вы могли почти тривиально создать (с помощью старой доброй локтевой смазки или отражениябиблиотека) интерфейс B , который предоставляет только то подмножество методов, которое вы хотите.

interface DirtyThirdPartyInterface {StupidCrap getSomeStupidCrap ();void setStupidCrap ();}

interface MySanitizedInterface {StupidCrap getSomeStupidCrap ();// сеттер не является частью этого интерфейса}

Затем с помощью, скажем, Spring AOP или чего-то подобного или одной из нескольких библиотек отражений, вы можете автоматически сгенерировать реализацию MySanitizedInterface как AOPперехватчик, который просто передает вызов получателю (через отражение) получателю в стороннем интерфейсе.

Но, опять же, это много дерьма (не говоря уже о зависимостях сторонних библиотек), чтобы просто избежать того, какие суммыбыть простым ручным кодированием.Редко можно найти случай из реальной жизни, который оправдывает всю эту водопроводную малярию.Если бы я столкнулся с чем-то подобным, первое, что я подумал бы, это «красный флаг».YMMV конечно.

0 голосов
/ 10 августа 2011

Предполагая, что вы получаете экземпляр EditorActions из библиотеки, вы можете сделать это:

public class FooActions implements MyEditorActions, EditorActions{
    private EditorActions internal;

    public FooActions(EditorActions internal){
        this.internal = internal;
    }

    @Override
    public void create(){
        internal.create();
    }

    @Override
    public void myCreate(){
        // do stuff
        this.create();
    }
}

Для этого нужно обернуть экземпляр библиотечного объекта объектом, который реализует тот же интерфейс, что и ваш. Затем вы просто выставляете объект как какой бы интерфейс вы ни хотели.

EditorActions a1 = new FooActions(); // a1 only shows library methods
MyEditorActions a2 = a1; // now a2 only shows your methods
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...