我可以使用超类的类工厂静态方法创建子类实例吗?

okariotis:

问题:

我想扩展Java的java.util。BitSet使用我自己的MyBitSet,只是添加一些我经常使用的功能/转换方法。

我真正在我的代码中发现有用的BitSet方法是“类工厂”公共静态方法BitSet.valueOf(long []),因此我希望MyBitSet类提供与从提供的long创建MyBitSet实例相同的实用程序[]。

问题是Java的BitSet没有提供接受long []参数的公共构造函数,因此我不能只使用super()。

并且BitSet.valueOf(long [])返回一个新的BitSet对象,因此由于ClassCastException,我不能将其强制转换为MyBitSet子类。

另外,BitSet.valueOf(long [])方法设置了一些我无法通过MyBitSet子类访问的BitSet私有变量,因此,我看不到直接复制超类的实现的任何简便方法-不好解决方案,但我只是在这里考虑我的选择。

题:

我可以在MyBitSet子类中提供某种功能吗?

通常,是否可以利用像valueOf(long [])这样的“类工厂”静态方法来创建我自己的子类的实例?

有什么我可能会忽略的吗?

解决方案我宁愿避免:

一种替代解决方案是使用BitSet的包装器类而不是对其进行扩展。

也就是说,一个类将一个BitSet实例保存为一个变量,并在该BitSet变量中应用我需要的其他功能。
但是,这种方法现在感觉有点怪异,如果可能的话,我宁愿只是扩展BitSet。

思考食品类型的问题:

BitSet.valueOf(long [])是一种在特定的初始化状态而不是默认状态下创建新BitSet实例的方法

难道没有提供这样的公共构造函数,而是仅提供“类似于工厂”的静态方法实际上是一种预期的模式,以防止开发人员在默认状态以外的其他状态下使用它来初始化自己的子类实例吗?

如果是这样,为什么?在这种情况下会是什么问题?

jaco0646:

我可以在MyBitSet子类中提供某种功能吗?

通常,是否可以利用像valueOf(long [])这样的“类工厂”静态方法来创建我自己的子类的实例?

您当然可以在子类中添加一个新的静态工厂方法。但它不会从父类继承任何方法。客户将必须找到您的新静态方法并知道要调用它。

有什么我可能会忽略的吗?

你说包装课有点奇怪我不知道这是什么意思,但您可能已经听说过,更喜欢组合而不是继承

相反,“类似于工厂”的静态方法实际上是预期的模式

是的,静态工厂方法无疑是预期的模式。标签Wiki中列出了它的优缺点。模式的实现方式可以相当灵活,也可以完全不灵活。如果作者想使用它来强制执行特定的默认值,那就是一个不灵活的用例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

子类可以使用模板父类的静态方法吗?

我可以使用父类的方法创建子类的对象吗

Java:如何使用超类的静态方法从其创建子类的实例

我可以在抽象类中创建静态工厂方法吗?

我可以在超类中使用子类的名称吗?

我可以使用类助手来调用静态私有类方法吗?

子类可以访问“继承”正确的术语来解释超类的静态方法吗?

您可以使用超类的对象访问子类变量吗?

我可以使用方法而不是类 Quartz 来定义作业实例吗?

我们可以创建一个不能从类中调用任何方法的类(超类或子类)的对象吗?

Javascript 子类中的实例方法可以调用它的父类静态方法吗?

我可以使用Object.assign创建“类”吗

我可以使用 for 循环来创建类吗?

为什么我可以从子实例访问我的超类的静态方法?

我可以在超类的数组上调用子类吗?

如何使用超类的构造函数创建子类的实例

如何使用超类构造函数创建子类的实例?

子类中的方法可以重载超类中的方法吗?

超类方法可以覆盖子类方法吗?

如何从超类创建子类的实例的数组

如何从超类创建子类的实例?

我如何在超类方法中使用子类的静态字段

父类可以创建其子类的实例吗?

我可以使用类对象实例化一个类吗?构造函数呢?

我可以使用其基类的实例初始化派生的数据类吗?

我可以使用类实例的类来提高可读性吗?

可以使用类A的实例作为类B的属性吗

使用子类和超类引用访问实例方法

如何使超类方法返回子类的实例