抽象类扩展返回类型

阳光明媚

我有一个抽象类,该抽象类由另外两个类扩展。在抽象类中,我有一个由这两个类以不同方式实现的方法。即使我不知道它是哪个具体的类对象,我也希望能够使用该方法。有没有一种方法可以使返回类型与非抽象类型上使用的方法相同?

为了更具体,抽象类的相关部分:

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(即PuzzleStateQueenState此处)中,都有返回一个逻辑,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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

返回抽象类中的具体类型

来自分类Dev

扩展抽象类

来自分类Dev

扩展抽象类

来自分类Dev

Java的抽象类得到扩展类的类型

来自分类Dev

如何使地图返回扩展了抽象类的类?

来自分类Dev

使用通用枚举类型扩展抽象类

来自分类Dev

抽象类和扩展器的类型

来自分类Dev

抽象类是否可以具有其他抽象类的返回类型的方法?

来自分类Dev

如何指定抽象类方法的返回类型

来自分类Dev

如何指定抽象类方法的返回类型

来自分类Dev

如何返回抽象类型?

来自分类Dev

Scala 返回抽象类

来自分类Dev

抽象类扩展了具体类

来自分类Dev

扩展抽象类的匿名类

来自分类Dev

类扩展抽象类实现接口

来自分类Dev

抽象类扩展具体类

来自分类Dev

根据类型类设置抽象类型

来自分类Dev

具有返回不同类型子项的抽象类中的C#抽象方法

来自分类Dev

抽象类是否扩展Object?

来自分类Dev

WebAPI返回JSON时正确序列化从抽象类型派生的类,但不返回XML

来自分类Dev

分配抽象类类型的对象

来自分类Dev

boost ::可选的抽象类类型

来自分类Dev

抽象类的具体子类的Typescript类型

来自分类Dev

何时使用抽象类作为类型

来自分类Dev

抽象类的通配符类型推断

来自分类Dev

python中的抽象类:强制类型

来自分类Dev

使用抽象类从Collectiontype获取类型

来自分类Dev

Java抽象类和类型

来自分类Dev

函数签名返回抽象类