所以现在我在学习图论。我觉得为它制作一个程序会很酷。要创建不同的图,添加和删除节点、边和所有类似的排序。
这学期我没有编程课,所以我试着准备下学期他们重新开始的时候。
到目前为止,我有一个叫做图论(驱动/命令行)的类,它当然运行整个程序。
除了驱动类之外,我拥有的主要类是:--图:类型:路径、循环、完整.
因为它们都有节点和边的列表以及相同的添加/删除方法,所以我从图中继承了这些类型,比如路径和循环,所以我不必为每一个方法重新创建这100万个方法。
在driver类中,我有一个所有创建的图的列表。
ArrayList<Graph> graphs = new ArrayList<Graph>();
我的问题是,当我开始处理部分图类时,它和其他类一样继承了图,但是我无法访问这些方法。
当我创建一个部份时,我是驱动者:
Partite p = new Partite(blah, blah);
graphs.add(p);
当我从列表中得到这张图时,我无法访问有方的方法。我该怎么做呢。
发布于 2013-11-21 16:01:05
因为当您从graphs
获得元素时,它们将是Graph
类型的引用。
要从Partite
访问方法,必须向Partite
添加强制转换。
Partite p = new Partite(blah, blah);
graphs.add(p);
Partite other = (Partite)graphs.get(0);
other.methodFromPartite();
好了。
发布于 2013-11-21 16:02:22
基本解
如果您依赖于特定的Partite
方法(相对于Partite
的Graph
方法的版本),您不应该将它保存在Graph
的数组中,但是如果必须的话,您可以进行强制转换。
Graph g=graphs.get(i);
Partite p=(Partite)g;
请注意,如果您弄错了(尝试转换一些不是Partite
的东西),您将得到一个异常。可以预先检查转换是否可以通过使用
if (g instanceof Partite){
.....
}
更好的概念
但正如我所说,所有这些通常都是糟糕的程序设计的标志。更好的设计是只在读取此列表时触发一般的图形行为(Partite
仍在列表中,但它们将以Graphs
的形式运行),并为它们需要的任何不同行为保留一个单独的Partite
列表。
一个更好的概念
如果您可以以这样的方式组织您的程序,您只需要从Graph
调用方法,但是Parties
会覆盖其中的一些方法,这样它的行为方式就是理想的解决方案。
例如,Graph
有update和Partite
s‘重写update来完成它所需要的额外工作。所以
public class Graph {
public void update(){
doImportantWork();
}
}
public class Partite extends Graph{
@Override
public void update() {
super.update(); //so that the basic graph behavior happens
doPartiteSpecificImportantWork();
}
}
然而,这并不总是切合实际的。
发布于 2013-11-21 16:02:55
这可能是因为您试图使用对它的图引用来修改您的分部对象。如果您想使用父类引用调用特定于子类的方法,那么您的设计可能需要一些修改(--这是一个代码嗅觉)。为了暂时绕过它,现在您可以将您的图引用转换为一个部分引用。
((Partite)graphRef).[some method on partite]
https://stackoverflow.com/questions/20125775
复制相似问题