【发布时间】:2015-01-05 00:06:17
【问题描述】:
下面是关于在 TypeScript 接口 (Javascript) 中定义构造函数签名的问题,尽管最终它变得不可用。但是,这在 Objective-c 中是可能的,如果在其他地方也能做到这一点,那就太好了。
我有一组数据对象类,它们都将通过一个带有 json 字符串参数的通用构造函数来使用。当我选择 TypeScript 作为一个工具,它有一个编译器,可以帮助我更早地发现错误和问题,我如何在接口中定义一个构造函数,然后在类中实现它?
interface IParsable {
//constructor(json : string);
new (json : string);
}
class UserObject implements IParsable {
constructor(json : string) {
//...
}
代码有效,但编译器显示错误“错误 TS2420:类 'UserObject' 错误地实现了接口 'IParsable'。”如果我在接口中使用“构造函数”而不是 new,那么我会得到“未实现来自接口 IParsable 的方法构造函数”。
更新:在objective-c中,可以使用两种方法创建对象:
第一种方法:
UserObject *userObject = [[UserObject alloc] init];
对象的创建由两种方法组成。 Alloc - 分配所需的内存,init 是默认的构造函数名称。构造函数就像objective-c中的常规方法一样,并且有它们的名字。因此,如果您需要一个带参数的自定义构造函数,那么您只需定义一个新方法,例如 initWithJson:(NSString *)json。因此,您可以在界面中定义任何您想要的内容并执行合同。
第二种方法:
UserObject *userObject = [UserObject new];
new 是保留字,但它实际上执行 alloc + init 并且您不能使用自定义构造函数。因此,推荐的方法是使用 alloc + init,这样如果需要,您可以随时将其替换为自定义构造方法,如 alloc + initWithJson。
事实证明,即使在 java 或 C# 中也无法做到这一点。我一直认为这些语言在 OOP 方面更加标准且经过深思熟虑,尽管这件小事在 Objective-c 中做得更好。
【问题讨论】:
-
接口定义构造函数有什么用?
-
编译器有什么用?它是一种工具,可帮助您和您的队友更快地发现错误。此外,始终使用接口作为所有实现该接口的类的契约。构造函数只是一个方法,就像所有其他方法一样。在我的所有objective-c项目中,我都能够在接口中定义常见的东西,包括构造函数签名。很奇怪,我需要为这么明显的事情提出论据
-
我一直在努力解决类似的问题。 TypeScript 手册中的示例不起作用,我猜这是 TypeScript 编译器中的错误。我已经在 github github.com/Microsoft/TypeScript/issues/8917 上创建了一个问题
标签: java c# node.js typescript