public class NutritionFacts {
private final int calories;
public static class Builder {
private int calories = 0;
public Builder() {}
public Builder calories(int val) { calories = val; return this; }
public NutritionFacts build() { return new NutritionFacts(this); }
}
protected NutritionFacts(Builder builder) {
calories = builder.calories;
}
}
public class GMOFacts extends NutritionFacts {
private final boolean hasGMO;
public static class Builder extends NutritionFacts.Builder {
private boolean hasGMO = false;
public Builder() {}
public Builder GMO(boolean val) { hasGMO = val; return this; }
public GMOFacts build() { return new GMOFacts(this); }
}
protected GMOFacts(Builder builder) {
super(builder);
hasGMO = builder.hasGMO;
}
}
GMOFacts.Builder b = new GMOFacts.Builder();
b.GMO(true).calories(100);
GMOFacts.Builder b = new GMOFacts.Builder();
b.calories(100).GMO(true);
您可以使用泛型来解决它。我认为这被称为“奇怪的重复泛型模式”
使基类生成器方法的返回类型为泛型参数。
public class NutritionFacts {
private final int calories;
public static class Builder<T extends Builder<T>> {
private int calories = 0;
public Builder() {}
public T calories(int val) {
calories = val;
return (T) this;
}
public NutritionFacts build() { return new NutritionFacts(this); }
}
protected NutritionFacts(Builder<?> builder) {
calories = builder.calories;
}
}
现在用派生类生成器作为泛型参数实例化基生成器。
public class GMOFacts extends NutritionFacts {
private final boolean hasGMO;
public static class Builder extends NutritionFacts.Builder<Builder> {
private boolean hasGMO = false;
public Builder() {}
public Builder GMO(boolean val) {
hasGMO = val;
return this;
}
public GMOFacts build() { return new GMOFacts(this); }
}
protected GMOFacts(Builder builder) {
super(builder);
hasGMO = builder.hasGMO;
}
}
原文:Subclassing ndarray 介绍 子类化ndarray相对简单,但与其他Python对象相比,它有一些复杂性。 在这个页面上,我们解释了允许你子类化ndarray的机制,以及实现子类的含义。 ndarrays和对象创建 ndarray的子类化很复杂,因为ndarray类的新实例可以以三种不同的方式出现。 这些是: 显式构造函数调用 - 如MySubClass(params)。 这
创建基于对话框的应用程序主要是使用子类化 QDialog 的方法。在本节,我们采用这个方法创建一个稍微复杂的实例-可扩展对话框。 可扩展对话框通常只显示简单的外观,但是它还有一个切换按钮( toggle button), 可以让用户在对话框的简单外观和扩展外观之间来回切换。 可扩展对话框通常用于试图同时 满足普通用户和高级用户需要的应用程序中,这种应用程序通常会隐藏那些高级选项,除非 用户明确要求
问题内容: 给这篇Dobbs博士文章,尤其是Builder模式,我们如何处理将Builder子类化的情况?以该示例的简化版本为例,在该示例中我们想使用子类来添加GMO标签,一个简单的实现将是: 子类: 现在,我们可以编写如下代码: 但是,如果我们弄错了订单,那么一切都会失败: 问题当然是NutritionFacts.Builder返回a NutritionFacts.Builder,而不是a GM
问题内容: 我是java的新手,我试图创建一个XML文档并一遍又一遍地克隆此文档的特定节点(减去textnode)。有人回答了我,说我应该继承节点的子类并覆盖克隆。所以我的问题是 什么是子分类? 问题答案: @Charlie Martin解释了子类化的含义。 但是,尚不清楚您是否得到了很好的建议。如果要通过在内存中组装DOM来创建XML文档,则更好的方法将是使用静态方法创建一个助手类,该类执行需要
本文向大家介绍sprite-kit 子类化SKSpriteNode,包括了sprite-kit 子类化SKSpriteNode的使用技巧和注意事项,需要的朋友参考一下 示例 您可以子类化SKSpriteNode并定义自己的精灵类型。
问题内容: 我有以下课程: 这可以按预期工作(使用字符串的单词而不是字母来初始化集合)。但是,当我想对set的不可变版本执行相同操作时,该方法似乎被忽略: 我可以达到类似的目的吗? 问题答案: 是的,您需要重写特殊方法: 输出为: