两者之间有什么区别
class Pitch(var width: Int = 3, var height: Int = 5) {
constructor(capacity: Int): this()
}
和
class Pitch(var width: Int = 3, var height: Int = 5, capacity: Int)
构造函数有什么优点?
答案 0 :(得分:2)
当您像这样定义班级时:
class Pitch (var width: Int = 3, var height: Int = 5) {
constructor(capacity: Int): this() {}
}
您可以使用不带参数的构造函数创建Pitch
的实例,即:
val p = Pitch()
// also you can invoke constructors like this
val p1 = Pitch(30) // invoked secondary constructor
val p2 = Pitch(30, 20) // invoked primary constructor
当您像这样定义班级时:
class Pitch (var width: Int = 3, var height: Int = 5, capacity: Int) {
}
除默认值外,所有参数都是必需的。因此,在这种情况下,您不能将构造函数与空参数一起使用,您需要至少指定一个参数capacity
:
val p = Pitch(capacity = 40)
因此,在第一种情况下,您可以使用不带参数的构造函数。在第二种情况下,如果要调用构造函数并传递capacity
参数,则应在使用构造函数时显式命名它。
答案 1 :(得分:1)
构造函数有什么优点?
在第一个代码段中,您定义了两个构造函数,一个主要构造函数,一个次要构造函数。关于主构造函数的特殊之处在于,任何辅助构造函数始终必须调用它。
spyOn(SomeTypescriptClass, "SomeTypescriptClassProperty");
在两种情况下:export type IDataMock<T> = {
[P in keyof T]?: IDataMock<T[P]>;
};
export function dataMock<T>(instance: IDataMock<T>): T {
return instance as any;
}
// so where you need
const obj = dataMock<SomeBigType>({onlyOneProperty: "some value"});
和class Pitch (var width: Int = 3, var height: Int = 5) /* primary constructor */ {
// secondary constructor invokes primary constructor (with default values)
constructor(capacity: Int): this()
}
都会调用主构造函数。 Pitch(10)将调用辅助构造函数。
如果要为此实例Pitch()
调用主构造函数,则必须像这样明确地指定参数名称:
Pitch(10, 20)
您也可以将其转过来,并明确设置Pitch(10)
并保留其默认值Pitch(width = 30)
:
height
如您所见,使用两个具有默认值的参数(属性)将使您有4种可能的方式,可以仅通过主构造函数实例化该类。
指定辅助构造函数对提供实例化类的替代方法特别有用。
像这样使用
width
仅当您无法从Pitch(height = 30)
和class Pitch(var width: Int = 3, var height: Int = 5, capacity: Int)
推论capacity
的值时才有意义。因此,这取决于您的用例。