gpt4 book ai didi

java - 如何强制在抽象类的所有子类中定义构造函数

转载 作者:搜寻专家 更新时间:2023-11-01 00:54:34 24 4
gpt4 key购买 nike

我有一个定义抽象方法的抽象类 A。这意味着,对于一个可实例化的类,必须实现所有抽象方法。

我希望我的所有子类都实现一个以 2 个整数作为参数的构造函数。

声明构造函数违背了我的目的,因为我想要在子类中定义构造函数,而我对实现一无所知。此外,我不能将构造函数声明为抽象的;

有办法吗?

我想要的示例:

假设我正在定义 Matrix 类的 API。在我的问题中,Matrix 不能改变它们的维度。

要创建一个矩阵,我需要提供它的大小。

因此,我希望我所有的实现者都为构造函数提供大小作为参数。这个构造函数是由问题驱动的,而不是实现问题。只要保留这些方法的所有语义,实现就可以用它们做任何它想做的事。

假设我想在我的抽象类中提供 invert() 方法的基本实现。此方法将创建一个具有 this 倒置维度的新矩阵。更具体地说,正如在抽象类中定义的那样,它将使用采用两个整数的构造函数创建与 this 相同的类的新实例。因为它不知道它将使用反射 (getDefinedConstructor) 的实例,所以我想要一种方法来保证我会得到它并且它对实现有意义。

最佳答案

您不能在您的子类中强制使用构造函数的特定签名 - 但您可以强制它通过抽象类中采用两个整数的构造函数。子类可以从无参数构造函数调用该构造函数,例如传递常量。不过,这是最接近的。

此外,正如您所说,您对实现一无所知 - 那么您怎么知道他们有一个需要两个整数的构造函数是合适的?如果其中一个也需要 String 怎么办?或者对其中一个整数使用常量可能是有意义的。

这里的大局是什么 - 为什么您想在子类上强制使用特定的构造函数签名? (正如我所说,您实际上不能这样做,但如果您解释了您想要这样做的原因,解决方案可能会自行出现。)

一种选择是为工厂提供单独的接口(interface):

interface MyClassFactory
{
MyClass newInstance(int x, int y);
}

那么 MyClass 的每个具体子类还需要一个知道如何构建给定两个整数的实例的工厂。虽然这不是很方便——而且您仍然需要自己构建工厂的实例。再说一次,这里的真实情况如何?

关于java - 如何强制在抽象类的所有子类中定义构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45591600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com