我有一个带有一些抽象方法的抽象类。有没有办法将这些方法中的一些标记为可选方法?
abstract class Test {
protected abstract optionalMethod?(): JSX.Element[];
protected abstract requiredMethod(): string;
}
由于某些原因,我可以添加?
作为后缀,但似乎它什么都不做,因为我还必须在派生类中实现该方法。现在我正在使用它来标记它可以返回null
,这基本上是可选的穷人。
protected abstract optionalMethod?(): JSX.Element[] | null;
答案 0 :(得分:5)
abstract 的概念是未定义但将在继承的类中的东西。这就是为什么我们不能没有实现的抽象方法。
我建议您创建已在基类中实现的非抽象方法,以实现您的目标:
abstract class A {
protected abstract requiredMethod(): string;
protected emptyDefinition(): string | void {};
protected optionalMethod(): string {
return "something optional";
};
}
class B extends A {
protected requiredMethod(): string {
return "something required";
}
}
答案 1 :(得分:1)
我不确定这是否在某个时候发生了变化,但是今天(TS 4.3)您可以简单地使基类可选方法非抽象:
abstract class Base {
protected abstract required(): void;
protected optional?(): string;
print(): void {
console.log(this.optional?.() ?? "Base");
}
}
class Child1 extends Base {
protected required(): void { }
}
class Child2 extends Base {
protected required(): void { }
protected optional(): string {
return "Child";
}
}
const c1 = new Child1();
c1.print();
const c2 = new Child2();
c2.print();
在 TS Playground 上试试。
答案 2 :(得分:0)
Typescript不支持可选抽象函数的“省略”,但是您可以如下明确地将其保留为未定义:
abstract class Test {
protected abstract optionalMethod?(): JSX.Element[];
protected abstract requiredMethod(): string;
}
class MyTest extends Test {
protected optionalMethod: undefined;
protected requiredMethod(): string {
return 'requiredResult';
}
}
答案 3 :(得分:0)
您可以通过类和接口合并来做到这一点:
interface Foo {
print?(l: string): void;
}
abstract class Foo {
abstract baz(): void;
foo() {
this.print && this.print('foo');
}
}
class Bar extends Foo {
baz(): void {
if (this.print) {
this.print('bar');
}
}
}