Расширить суперкласс в середине иерархии классов в библиотеке

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

class A { ... }

class B extends A { ... }

class C extends A { ... }

class myD extends B {

    protected void overriddenAfunction() { ... }

}

Это, очевидно, нехорошо, когда несколько классов расширяют один и тот же суперкласс, и я хочу, чтобы все подклассы использовали одни и те же переопределенные методы (например, если бы C также потребовалось бы одно и то же определение overridenAFunction()).

Есть ли какой-то шаблон дизайна или способ сделать это красивым? Я предполагаю, что вы могли бы сделать что-то вроде этого:

class A { ... }

class B extends A { ... }

class C extends A { ... }

class myD extends A {

    private A BorC = null;

    public myD(A BorC) {

        this.BorC = BorC;

    }

    protected void overriddenAfunction() { ... }

    public void overriddenBfunction() { 

        ((B) BorC).overriddenBfunction();

    }

    public void overriddenCfunction() { 

        ((C) BorC).overriddenCfunction();

    }

}

Usage:

A testB = new myD(new B());
A testC = new myD(new C());

Однако тогда мне нужно будет использовать каждый метод из B и C, если он вообще работает.

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

Думаю, я мог бы также сделать копии B и C и сделать так, чтобы они расширяли myD, а myD расширял A. В этой библиотеке также есть все доступные исходные файлы, поэтому я могу сделать это или что-то подобное.


person user1540134    schedule 20.07.2012    source источник


Ответы (1)


Невозможно переопределить A таким образом, чтобы позволить B и C воспользоваться новыми функциями. У вас есть только два варианта, которые я вижу, и вы упоминаете их оба:

  • Перепишите A и перепакуйте библиотеку
  • Пусть MyD расширяет A, а затем делает копии B и C, которые вместо этого расширяют MyD.
person Keppil    schedule 20.07.2012
comment
Наверное, я плохо объяснил ситуацию. Я работаю с JFreeChart (это библиотека для рисования диаграмм). У него есть один класс NumberAxis (A) с функциями, управляющими, среди прочего, тем, как должны рисоваться деления на осях. Затем у него есть классы DateAxis (B) и SymbolAxis (C), которые расширяют этот класс. Эти классы содержат некоторые специфические функции, такие как настройка формата меток. Что я хочу сделать, так это какой-то эффективный способ переопределить методы в NumberAxis, чтобы их могли использовать как DateAxis, так и SymbolAxis. - person user1540134; 20.07.2012