当前位置: 首页 > 面试题库 >

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

蒙弘图
2023-03-14
问题内容

我有一个html" target="_blank">定义抽象方法的抽象类A。这意味着,要使一个类变得可实例化,必须实现所有抽象方法。

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

声明构造函数违反了我的目的,因为我希望在子类中定义构造函数,而我对实现一无所知。而且,我不能将构造函数声明为抽象的。

有没有办法做到这一点 ?

我想要的例子:

可以说我正在定义Matrix类的API。在我的问题中,Matrix无法更改其尺寸。

对于要创建的矩阵,我需要提供其大小。

因此,我希望我的所有实现者都向构造函数提供大小作为参数。该构造函数的目的是问题,而不是实现方面的问题。只要保留方法的所有语义,该实现就可以使用它们执行任何操作。

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


问题答案:

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

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

这里的全局是什么- 为什么 要在子类上强制使用特定的构造函数签名?(正如我所说,您实际上无法 做到 这一点,但是如果您解释了为什么 要这样做
,则可能会提出解决方案。)

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

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

然后,您的每个具体子类MyClass还需要一个工厂,该工厂知道如何在给定两个整数的情况下构建实例。但是,这并不十分方便-
而且您仍然需要构建工厂本身的实例。同样,这里的真实情况是什么?



 类似资料:
  • 问题内容: 在Java中,在抽象类中使用私有构造函数的目的是什么? 在一个评论中,我得到了这个问题,我很好奇,在什么情况下我们需要以这种方式使用构造函数? 我认为它可以与抽象类中的另一个构造函数一起使用,但这非常简单。它也可以用于构造将超过抽象类的静态内部类。 也许还有更优雅的用法? 问题答案: 如果构造函数是类的 唯一 构造函数,则原因很明确:防止子类化。一些类仅充当静态字段/方法的持有者,而不

  • 我有一个java类,它只有静态方法和字段,所以我不想为此创建任何对象。我可以从两个方面来理解, 创建类摘要 使用私有构造函数。 这两种方法哪一种更好?

  • 问题内容: 我有这样的事情: 如您所见,超类的init方法是抽象的,并在创建对象后由构造函数自动调用。 当我需要创建这种类型的对象且其结构不会及时更改时,我很好奇我是否会遇到这样的代码问题。 有什么更好的办法吗?它可以在Java中运行,但是可以在C ++和ActionScript中运行吗? 谢谢你的答案。 问题答案: 请勿从构造函数中调用过多的方法。 引用 有效Java 2nd Edition,条

  • 问题内容: 由于我们无法实例化抽象类,那么在抽象类中具有构造函数的必要性是什么? 问题答案: 抽象类被设计为可扩展的,子类中的每个构造函数都必须执行对基类的构造函数的调用,因此,您的抽象类中需要构造函数。 抽象类是一个骨架,因此直接实例化它是没有意义的,因为它仍然不完整(孩子们会提供其余的东西)。

  • TypeScript中非抽象类(非抽象构造函数)的类型签名如下: 这也称为可更新类型。但是,我需要一个抽象类(抽象构造函数)的类型签名。我理解它可以定义为具有类型,但这太宽泛了。难道没有更精确的替代方案吗? 编辑: 为了阐明我的意思,下面的小片段演示了抽象构造函数和非抽象构造函数之间的区别: 类型'typeof实用程序'不能分配给类型'new(... args: any[])= 无法将抽象构造函数