Рефакторинг Java-классов, где методы имеют разные типы параметров - PullRequest
0 голосов
/ 14 мая 2018

У меня есть два класса, которые extend являются абстрактным классом очень похожим образом, и я хотел бы абстрагироваться от общих частей, поскольку мне, вероятно, придется использовать это снова. Каждый из них возвращает ThingLink, содержащий данные, связывающие их с Parent объектом. Они также возвращают Widget, который зависит от класса, но зависит только от их имени. Вот образец:

public abstract class SomeClass extends TopClass {
    protected abstract Widget createWidget();

    public void someMethod() { // Does something }
}

public class ThingA extends SomeClass {

    private static final String INFO_TYPE = "int";

    public ThingLink newLink(Parent master, Int info) {
        ThingLink link = new ThingLink(parent, ThingA.class);
        link.addData(INFO_TYPE, info);
        return link;
    }

    public Widget createWidget() {
        // Stuff to get someData
        return ThingAWidget.createMe(someData);
    }
}

public class ThingB extends SomeClass {

    private static final String INFO_TYPE = "String";

    public ThingLink newLink(Parent master, String info) {
        ThingLink link = new ThingLink(parent, ThingB.class);
        link.addData(INFO_TYPE, info);
        return link;
    }

    public Widget createWidget() {
        // Stuff to get someData
        return ThingBWidget.createMe(someData);
    }
}

У меня нет доступа к TopClass, классу ThingLink или Widget. Я пытался абстрагироваться от общих частей, используя дженерики, но я не могу понять, даст ли это полное решение. Моя большая проблема - выяснить, как получить фрагменты, которые ссылаются на себя. Я хотел бы, чтобы класс что-то вроде:

public abstract class Thing<T> extends SomeClass {
    private String infoType;

    public void setInfoType(String type) { infoType = type; }

    public ThingLink newLink(Parent master, T info {
        ThingLink link = new ThingLink(parent, ???????????);
        link.addData(infoType, info);
        return link;
    }

    public Widget createWidget() {
        // Stuff to get someData
        return ??????????????.createMe(someData);
    }
}

Имейте в виду, что я довольно новичок в Java и самоучка, но я очень стараюсь сделать несколько больших прыжков и действительно понять, как писать хороший код. Я ценю вашу помощь.

...