我有一个抽象类,该抽象类由另外两个类扩展。在抽象类中,我有一个由这两个类以不同方式实现的方法。即使我不知道它是哪个具体的类对象,我也希望能够使用该方法。有没有一种方法可以使返回类型与非抽象类型上使用的方法相同?
为了更具体,抽象类的相关部分:
public abstract class State<abstarct> {
public abstract Set<State<?>> findNeighbors();
对于其他两个类:
public class PuzzleState extends State<PuzzleState> {
@Override
public Set<PuzzleState> findNeighbors() {
// making the set
// unrelevant to the question
return set;
}
和
public class QueensState extends State<QueensState> {
@Override
public Set<QueensState> findNeighbors() {
// making the set
// unrelevant to the question
return set;
}
目前,它当然行不通。我只是以为State可能就是我想要的,但事实并非如此。有办法使它起作用吗?我希望findNeighbors()根据使用的方法返回Set或Set。我希望这样,因为在程序的另一部分中,我有一个display()方法,该方法将PuzzleState或QueensState作为输入并进行相应显示。
我不知道我的问题是否足够清楚,但是基本上我只是想知道是否有一种方法可以根据类来更改抽象方法的返回类型。
为什么要State
声明为泛型?我这样做没有看到任何具体的价值。如果您想要实现的只是能够State
从子目录中返回Concrete,那么您也可以这样做:
abstract class State {
public abstract Set<? extends State> findNeighbors();
}
然后您的子状态为:
class PuzzleState extends State {
@Override
public Set<PuzzleState> findNeighbors() {
Set<PuzzleState> set = new HashSet<PuzzleState>();
return set;
}
}
和
class QueensState extends State {
@Override
public Set<QueensState> findNeighbors() {
Set<QueensState> set = new HashSet<QueensState>();
return set;
}
}
OPs第一个评论后进行编辑:
我有一些用于显示的类,它们需要知道是拼图状态还是皇后状态
如果您的处理逻辑取决于具体类型的知识,并且不能基于抽象类型进行多态操作-那么,如果您要坚持SOLID设计原则,那就很可能是设计问题/气味。
您可以考虑重构代码中显示特定状态的部分,如下所示:
在每个具体对象State
(即PuzzleState
和QueenState
此处)中,都有返回一个逻辑,interface StateImage
然后在gui部分中要呈现状态的可视形式的逻辑-使用interface ImageRenderer
abstract class State implements StateDisplayable{ public abstract Set<? extends State> findNeighbors(); }
class PuzzleState extends State {
@Override
public Set<PuzzleState> findNeighbors() {
Set<PuzzleState> set = new HashSet<PuzzleState>();
return set;
}
public Image getImage(){
return new PuzzleStateImage(); // implement this for Puzzle !!
}
}
class QueensState extends State {
@Override
public Set<QueensState> findNeighbors() {
Set<QueensState> set = new HashSet<QueensState>();
return set;
}
public Image getImage(){
return new QueenStateImage(); // implement this for QueenState!!
}
}
abstract class Image {
abstract void draw();
}
class PuzzleStateImage extends Image {
void draw() {
// knows what/how to render PuzzleState for a visual component
}
}
class QueenStateImage extends Image {
void draw() {
// knows what/how to render QueenStateImage for a visual component
}
}
interface StateDisplayable {
Image getImage();
}
interface StateRenderer {
void draw(Image state);
}
然后在GUI代码中
void display(){
StateRenderer renderer = null ; // instantiate
Set<? extends State> states = null; // get your states here ( this is a mix of Puzzle and Queen states - but you dont care about the concrete type )
for(StateDisplayable state : states){
Image stateImage = state.getImage(); // this could be Puzzle or Queen stateImage
renderer.draw(stateImage);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句