Я занят написанием API, который изменяет график. Чтобы контролировать то, что я просматриваю для пользователей API, я использую интерфейсы.Устранить необходимость в литье
Интерфейсы, раскрывающие методы, которые будут использоваться, следующие. По существу это то, что пользователь увидит:
public interface GraphEditor{
Edge addEdge(AsbtractNode f, AbstractNode t)
}
public interface AbstractNode{
}
public interface ExampleNode1 extends AbstractNode{
}
public interface ExampleNode2 extends AbstractNode{
}
Структура реализации:
public class GraphEditorImpl implements GraphEditor{
public Edge addEdge(AsbtractNode f, AbstractNode t){
AbstractNodeImpl from = (AbstractNodeImpl) f;
AbstractNodeImpl t = (AbstractNodeImpl) f;
from.getVertex().addEdge(t.getVertex);
}
}
public class AbstractNodeImpl implements AbstractNode{
Vertex vertex; //Must remain hidden from users
public Vertex getVertex(){
return vertex;
}
}
Внутри граф редактор У меня есть метод, который позволяет пользователю добавлять и ребро между двумя узлами addEdge
. Этот метод должен отличать AbstractNode
от AbstractNodeImpl
, чтобы получить доступ к методу getVertex()
, который необходим для получения «Вершины».
Я не могу разоблачить getVertex()
в интерфейсе AbstractNode
, так как у меня не могут быть пользователи, непосредственно работающие с Vertex
. Есть ли способ достичь такого рода функциональности без необходимости отбрасывать из интерфейса в реализацию?
Но так как пользователи уже имеют 'AbstractNode' объект, может 't они просто передают его в 'AbstractNodeImpl' и вызывают' getVertex() 'anyways? – AJC
Что такого чувствительного к 'Vertex', что вы не хотите, чтобы пользователи имели доступ? Что мешает им обращать на него внимание или кастингать? –
'AbstractNodeImpl t = (AbstractNodeImpl) f;', вероятно, опечатка ...? – Puce