Vertex是抽象类
Word 和 Person继承于他,在组成相应的边时(WordEdge,SocialEdge),到底用Vertex的实例化来做还是直接用Word,Person的实例化。
举例:
Vertex A = new PersonVertexFactory().createVertex("A", args2);
还是Person A = new PersonVertexFactory().createVertex("A", args2);
结论:用第一种, 因为我们抽象出来的Vertex,Edge,Graph类,那些子类只是他们的不同实现,我们的目的是得到一个点,一个边,一个图。而且,如果用子类来生成边,会导致抽象类中的一些方法无法使用,如,Set<Vertex> vertices()因为返回值类型不同
addVertices(List<Vertex> vertices),传参类型不同,会引起麻烦,当然,也可以用泛型修改抽象类的方法,
Set<? extends Vertex> vertices(),addVertices(List<? extends Vertex> vertices)。但这增加了代码维护的工作量,至少在这个实验中是不合适的。
最重要的问题,有些方法,譬如toString,equals在不同子类中有不同的Override方法,那我都用Vertex来修饰,会不会导致调动父类中的方法。
测试如下:
Vertex A = new PersonVertexFactory().createVertex("A", args2);
Vertex W = new WordVertexFactory().createVertex("A", null);
直接比较这两个实例的类型是否相同,
assertEquals(A.getClass(),W.getClass());
测试结果:
java.lang.AssertionError: expected:<class vertex.Person> but was:<class vertex.Word>
得出结论,他们仍然是他们的子类型,当然也会调用各自重载的方法。
System.out.println(A.toString());
System.out.println(W.toString());
运行结果:
<"A", "Person", <"F", "21">>
<"A", "Word">