TypeScript:指定变量是抽象类的后代
假设 我想要一个包含TypeScript:指定变量是抽象类的后代,typescript,Typescript,假设 我想要一个包含B和C的数组。可通过以下方式完成: abstract class A { protected abstract f(): void; } class B extends A { public f() { return 'B'; } } class C extends A { public f() { return 'C'; } } 让arr:Array=[/*很多对象*/]; arr.forEach(item=>item.f()); 在这里,我想使Arra
B
和C
的数组。可通过以下方式完成:
abstract class A {
protected abstract f(): void;
}
class B extends A {
public f() { return 'B'; }
}
class C extends A {
public f() { return 'C'; }
}
让arr:Array=[/*很多对象*/];
arr.forEach(item=>item.f());
在这里,我想使Array
更加灵活和通用,这样它将是Array
有人能给我一个建议吗?你可以用
A
作为数组项f
应该是公共的如果您计划在类外部的派生类型上调用它,则对要保护的抽象成员没有限制:
let arr: Array<B | C> = [/* lots of objects */];
arr.forEach(item => item.f());
抽象类A{
公共摘要f():字符串;
}
B类扩展了A类{
公共f(){return'B';}
}
C类扩展了{
公共f(){return'C';}
}
让arr:Array=[/*很多对象*/];
arr.forEach(item=>item.f());
为什么不让arr:Array
,A
是抽象的,不能创建A
的实例,因此数组中的所有实例都将是A
@TitianCernicova Dragomir的子类型。如果这样做,问题是:item.f()
会引发编译错误,属性f是受保护的,并且只能在类A及其子类中访问。如果f
在所有派生类上都是公共的,为什么在A
中声明为protected
?将它公开,一切都会按预期工作。你能不能不使用一个接口而不是抽象的interface MyInterface{f:()=>void;}
并在任何扩展类上实现它,然后你可以使用let arr:MyInterface[]
?@TitianCernicova Dragomir-Uhm,因为Base
是一个抽象类。我不确定是否有一种解决方法——在抽象类中定义一个空的public f()
并在子类中覆盖它。在抽象类中声明一个返回类型void
,但在子类中声明string
,感觉不太正确。这似乎违反了Liskovs SP.@DavidBarker我刚才复制粘贴的,你当然是对的
abstract class A {
public abstract f(): string;
}
class B extends A {
public f() { return 'B'; }
}
class C extends A {
public f() { return 'C'; }
}
let arr: Array<A> = [/* lots of objects */];
arr.forEach(item => item.f());