RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1074483
Accepted
Miron
Miron
Asked:2020-01-26 14:11:42 +0000 UTC2020-01-26 14:11:42 +0000 UTC 2020-01-26 14:11:42 +0000 UTC

函数的返回类型(基于类数据)必须可以转换为其他几种类型。如何构建正确的架构?

  • 772

让我们以仅知道该函数所在的类的类型就可以将函数的返回类型转换为其他类型为基础,因为函数的返回类型直接取决于执行的计算在解析过程中。
下面的解决方案立刻浮现在脑海:创建一个解析器类,其中有许多解析函数,可以将函数的返回类型转换为其他类型。但是可以通过没有方法的接口仅表明这是一个解析器。然后整个抽象崩溃了——我们开始依赖特定的实现。如何进行?可能是我一开始建的系统不正确,这个问题是根治不了的?

如果需要,这里是程序的文本:

public interface Crashable<OutputType, ToBreakDeterminator> {
    boolean hasCrushed();
    default boolean canBreakDown(CrasherUI<OutputType, ToBreakDeterminator> crasher) { // проверять должен CrasherUI.canCrash()!
        return crasher.canCrash(this);
    }
    OutputType breakDown(CrasherUI<OutputType, ToBreakDeterminator> crasherUI) throws IllegalStateException;
    ToBreakDeterminator getToBreakDeterminator();   
}

public class Thing implements Crashable<String, Integer>{
    private Integer rigidity;
    private String name;

    private CrasherUI crushedBy;

    public final static Integer DEFAULT_RIGIDITY = 50;
    public final static String DEFAULT_NAME = "unnamed";

    {
        crushedBy = null;
    }

    //...

    @Override
    public String breakDown(CrasherUI<String, Integer> crasher) throws IllegalStateException {
        if(hasCrushed()) {
            throw new IllegalStateException("It is already crushed by " + crushedBy);
        }
        crushedBy = crasher;
        return "u broke " + name + " with " + rigidity + " by " + crasher + ", dude"; 
        // это возврат ф-ции. По-идее должен возвращать уже OutputType(см абстрактный класс)
    }

    //...
}

这是抽象类本身:

public abstract class AbstractApartaments<OutputType, InputType, ToBreakDeterminator> implements ApartamentUI{
    private Stack<? extends Crashable<InputType, ToBreakDeterminator>> things;

    private CrasherUI<InputType, ToBreakDeterminator> crasher;

    private Function<InputType, OutputType> inputToOutput; // один тип(Crashable) только обрабатывать можем. 
    private ConcurrentLinkedQueue<OutputType> toUserOutputs;
    private ToUserOutputUI<OutputType> out;

    {
        things = new Stack();
        toUserOutputs = new ConcurrentLinkedQueue();
    }

    public AbstractApartaments(Collection<? extends Crashable<InputType, ToBreakDeterminator>> toCrush, CrasherUI<InputType, ToBreakDeterminator> crasher, Function<InputType, OutputType> inputToOutput, ToUserOutputUI<OutputType> out){
        things.addAll(toCrush); // Ошибка!
        this.crasher = crasher;
        this.inputToOutput = inputToOutput;
        this.out = out;
    }


    @Override
    public boolean hasThingsToCrash() {
        return things.isEmpty();
    }

    @Override
    public boolean crashNext() {
        if(!things.isEmpty()) {
            Crashable<InputType, ToBreakDeterminator> toCrash = things.pop();
            if(toCrash.canBreakDown(crasher)) {
                toUserOutputs.add(inputToOutput.apply(toCrash.breakDown(crasher)));
                return true;
            } else {
                return false;
            }
        } else {
            throw new NoSuchElementException();
        }
    }

    @Override
    public void pullToUserOutputs() {
        while(!toUserOutputs.isEmpty()) {
            out.toOutput(toUserOutputs.poll());
        }
    }

}
java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Z.John
    2020-01-26T15:41:13Z2020-01-26T15:41:13Z

    请注意,您的队列可以接受从 Crashable 继承的任何类型

    public abstract class AbstractApartaments<InputType, ToBreakDeterminator> implements ApartamentUI{
    private Stack<Crashable> things;
    private CrasherUI crasher;
    private ConcurrentLinkedQueue<Crashable> toUserOutputs;
    private ToUserOutputUI<OutputType> out;
    
    {
        things = new Stack<>();
        toUserOutputs = new ConcurrentLinkedQueue<>();
    }
    
    public AbstractApartaments( Collection<? extends Crashable<InputType, ToBreakDeterminator>> toCrush,
                                CrasherUI<InputType, ToBreakDeterminator> crasher,
                                ToUserOutputUI<OutputType> out){
    
        this.things.addAll(toCrush);
        this.crasher = crasher;
        this.out = out;
    }
    
    
    @Override
    public boolean hasThingsToCrash() {
        return things.isEmpty();
    }
    
    @Override
    public boolean crashNext() {
        if(!things.isEmpty()) {
            Crashable toCrash = things.pop();
            if(toCrash.canBreakDown(crasher)) {
                toUserOutputs.add(toCrash.breakDown(crasher));
                return true;
            } else {
                return false;
            }
        } else {
            throw new NoSuchElementException();
        }
    }
    
    @Override
    public void pullToUserOutputs() {
        while(!toUserOutputs.isEmpty()) {
            out.toOutput(toUserOutputs.poll());
        }
    }
    
    }
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5