Как создать конструктор polymorphi c в Java - PullRequest
0 голосов
/ 03 февраля 2020

В заголовке указано Java, но я думаю, что этот вопрос относится к OOP языкам с аналогичной статической типизацией, таким как Java. Итак, вот так:

Учитывая ситуацию, подобную этой

package com.company;

public class SomeGenericClass<T> {
    private T  thing;

    public T returnThing() {
        // this is fine
        return thing;
    }

    public T mergeThisThingWith(T otherThing) {
        //?? 
        // This involves using some sort of constructor to create an instance of
        // whatever T is, using this, and the otherThing passed in. In this case,
        // how do one handle this pattern where a constructor needs to be used polymorphically?
        return null;
    }

}

Как реализовать метод, который требует наличия своего рода конструктора элемента generi c, в котором он нуждается return.

Даже если тип generi c имеет ограничение, это не поможет. Ограничение делает доступными только методы на границе, но не конструктор. Так, например:

package com.company;

public class SomeGenericClass<T extends AClass> {
    private T  thing;

    public T returnThing() {
        // this is fine
        return thing;
    }

    public T mergeThisThingWith(T otherThing) {
        //?? 
        // This involves using some sort of constructor to create an instance of
        // whatever T is, using this, and the otherThing passed in. In this case,
        // how do one handle this pattern where a constructor needs to be used polymorphically?
        return null;
    }

    public T returnUsingMethodOnAClass() {
        // this is fine
        return this.thing.methodOnAClass();
    }

    public T returnANewTUsingMethodOnAClass() {
        // still can't create a new instance of 
        // whatever T is, using a constructor
        return null
    }

}

Аналогичная ситуация также может наблюдаться в случае наследования, поэтому с учетом этого базового класса:

public class SomeGenericClass {
    public String returnString() {
        return "This is fine";
    }

    public SomeGenericClass returnChildClass() {
        // How do one implement this method such that it
        // returns RedThing in case, it is called on an instance of RedThing
        // or it returns BlueThing in case, it is called on an instance of BlueThing

        return null;
    }

}

Как можно реализовать returnChildClass так, чтобы он возвращает RedThing в случае, если он вызывается для экземпляра RedThing или возвращает BlueThing в случае, если он вызывается для экземпляра BlueThing

В основном, как это можно реализовать так, чтобы возможно следующее:

RedThing redThing = new RedThing();
BlueThing blueThing = new BlueThing();

RedThing someGenericClass = redThing.returnChildClass();
BlueThing someGenericClass = blueThing.returnChildClass();

Кажется, что я ищу шаблон с полиморфными c конструкторами. Это действительная вещь, чтобы ожидать? И если да, то как можно go реализовать такие?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...