Как сохранить объект типа переменной в поле в Java? - PullRequest
0 голосов
/ 23 мая 2019

Я создал объект на Java, который называется «Edge». Этот объект является направленным ребром для графа, который хранит ссылку на узел в его начале и узел в его конце.

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

public class Edge{

    private Vertex org; //this is the line that I want to be able to store a 
                        //face given certain conditions (the index being 1 or 3)

    private Face left;  //this is a line where I want to store a face normally
                        //but store a Vertex if this is a dual edge

    private int index;  //a number from 0-3, where 1 and 3 are in the dual graph

    public Vertex Org(){
        return org;
    }

}

Мне было интересно, существует ли способ определения функции Org () и поля org таким образом, чтобы она могла быть либо гранью, либо вершиной. Мне было интересно, если есть способ использовать универсальные типы, которые могут стать «вершина» или «лицо» в зависимости от параметра индекса. Пример того, что я попробовал, приведен ниже.

public class Edge<T>{

    public T org;

    private T Org(){
        return org;
    }

}

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

Мне было интересно, есть ли способ хранения поля, который может быть одним из двух возможных типов объектов, или другой простой способ обойти эту проблему.

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Вы не хотите возвращать совершенно разные типы объектов одним и тем же методом, потому что что бы вы сделали с ними после того, как вы их вернули?

Предположим, вы сделали:

Object faceOrVertex = edge.org(); // returns face or vertex

Так что теперь вы должны решить, что делать с вашим лицом или вершиной. Вам нужно будет написать:

if (faceOrVertex instanceof Face) {
    // cast to Face and do face stuff
} else {
    // cast to Vertex and do vertex stuff
}

Вы могли бы также вызвать два разных метода, возвращающих известные типы.

Дженерики здесь не помогут. Они не устраняют необходимость в разных типах.

Если ваши классы Face и Vertex имеют общие черты и вы хотите относиться к ним единообразно, решение состоит в том, чтобы объявить интерфейс с общими методами и классы Face и Vertex реализовать их. методы. Не зная точно, что вы хотите сделать с результатом метода org, невозможно что-то порекомендовать.

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

0 голосов
/ 23 мая 2019

Ваши Vertex и Face - это два разных типа, поэтому один метод никогда не сработает, если у вас нет интерфейса, который реализуют как Vertex, так и Face.Скажем, вы определили интерфейс GraphElement.Теперь ваш класс будет выглядеть примерно так:

public interface GraphElement {
    // operations
}

class Edge<V extends GraphElement, F extends GraphElement> {
    V vertex;
    F face;
    int index;

    GraphElement org() {
        // processing code
        return index % 2 == 0 ? face : vertex;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...