我正在尝试使用构造函数实现一个typescript类parentData
,而构造函数又有一些带有构造函数的其他类。当我这样做时,它会抛出improper implementation
。不明白可能是什么原因。
export class parentData implements foodsData, places {
constructor(
name: string,
id: number,
foods: foodsData[],
places: places
){}
}
export class foodsData {
constructor(
food1: string,
food2: string,
food3: string
){}
}
export class places {
constructor(
place1: string,
place2: string,
place3: string
){}
}
答案 0 :(得分:2)
你似乎误解了一个班级是什么,以及inheritance and interfaces是什么。了解如何设计类和面向对象的面向对象编程概念。界面以及为什么/在哪里/如何使用它们 - 那么你在上面尝试做的事情可能会更清楚。
你有:
export class parentData implements foodsData, places{ ...}
foodsData
和places
被定义为类,因此您无法implement
。
你implement
an interface
(通常是为了添加行为),而不是一个类。你extend
一个类(继承子类中的属性和方法),但你也不需要这样做。
目前,foodsData
和places
根本不需要成为课程。它们都是有限的字符串集合,没有行为或其他属性。在parentData
中,您已经拥有foods
和places
的无限集合,因此这些其他类没有任何实际用途。
考虑food
或place
具有哪些特征(属性)并考虑他们可以做什么(方法......不适用在这种情况下),并将该信息放入类定义中。然后,在ParentData
中,您只需创建类似于您已有的Food[]
和Place[]
类型的数组。无需implement
或extend
任何内容。 ParentData
类必须能够“看到”其他类的定义(所有类都需要在同一个文件中定义,或者您可以从其他文件中导入所需的类)。
另请注意:标准做法是将您的类名称大写,并对该类的实例使用小写
示例:
export class ParentData {
constructor(name: string,
id: number,
foods: Food[],
places: Place[]
){ }
}
export class Food {
constructor(name: string, color: string, price: number, calories: number ){}
}
export class Place {
constructor(name: string, address: string, zipCode: string, latitude: number, longitude: number){}
}
答案 1 :(得分:1)
我认为这些其他答案都是错误的。在其他语言中,您肯定会实现一个接口并继承一个类。在Typescript中,可以实现一个类。这要求在结果类型中实现所有属性和方法。
你的例子并没有给我带来麻烦。我认为可能是问题是你正在实现的一个类在构造函数参数上有一个方法访问器,这意味着它是类的一个属性。如果你在parentData
课程上实现了同样的属性,那么你应该没问题。
要清楚,您的示例适合我:
export class parentData implements foodsData, places {
constructor(name: string,
id: number,
foods: foodsData[],
places: places[]
){ }
}
export class foodsData {
constructor(food1: string,
food2: string,
food3: string){}
}
export class places {
constructor(place1: string,
place2: string,
place3: string){}
}
这不会,因为foodsData
在构造函数参数
export class parentData implements foodsData, places {
constructor(name: string,
id: number,
foods: foodsData[],
places: places[]
){ }
}
export class foodsData {
// NOTE THE 'private' modifier below. if this were public, it would work if you also add a 'public food1: string;' to the parentData class;
constructor(private food1: string,
food2: string,
food3: string){}
}
export class places {
constructor(place1: string,
place2: string,
place3: string){}
}
如果要实现类而不是扩展它,请避免使用public
修饰符以外的任何内容。
对于其他人:接口不会在Typescript中徘徊;他们在汇编时迷失了方向。有时候让一个类保持不变(能够使用instanceof
,例如),并且实现该类与C#这样的语言允许您实现接口类似。
答案 2 :(得分:0)
您只能实施界面。对于普通或抽象类,您必须扩展它。