我有一个定义抽象方法的抽象类 A。这意味着,要使一个类可实例化,必须实现所有抽象方法。
我希望我的所有子类都实现一个以 2 个整数作为参数的构造函数。
声明构造函数违背了我的目的,因为我希望在子类中定义构造函数,而我对实现一无所知。此外,我不能将构造函数声明为抽象的;
有没有办法做到这一点?
我想要的示例:
假设我正在定义一个 Matrix 类的 API。在我的问题中,Matrix 无法更改它们的尺寸。
要创建一个矩阵,我需要提供它的大小。
因此,我希望我的所有实现者都为构造函数提供大小作为参数。这个构造函数的动机是问题,而不是实现问题。只要保留方法的所有语义,实现就可以对这些进行任何操作。
假设我想在我的抽象类中提供 invert()
方法的基本实现。此方法将创建一个具有 this
反转维度的新矩阵。更具体地说,正如它在抽象类中定义的那样,它将使用带有两个 int 的构造函数创建与 this
相同的类的新实例。由于它不知道它将使用反射 (getDefinedConstructor) 的实例,因此我想要一种方法来保证我会得到它并且它将对实现有意义。
最佳答案
你不能在你的子类中强制构造一个特定的签名——但是你可以强制它通过你的抽象类中的一个构造函数来获取两个整数。例如,子类可以从无参数构造函数调用该构造函数,传递常量。不过,这是您能到达的最接近的距离。
此外,正如你所说,你对实现一无所知 - 那么你怎么知道他们有一个需要两个整数的构造函数是合适的?如果其中一个也需要字符串怎么办?或者可能对其中一个整数使用常量是有意义的。
这里的大局是什么 - 为什么你想在你的子类上强制一个特定的构造函数签名? (正如我所说,你实际上不能这样做,但如果你解释你为什么想要它,一个解决方案可能会出现。)
一种选择是为工厂提供单独的接口(interface):
interface MyClassFactory
{
MyClass newInstance(int x, int y);
}
然后,您的 MyClass
的每个具体子类还需要一个工厂,该工厂知道如何在给定两个整数的情况下构建一个实例。不过,这并不是很方便——而且您仍然需要自己构建工厂的实例。再说一遍,这里的真实情况是什么?
关于java - 如何强制在我的抽象类的所有子类中定义构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3164334/