东西沿着这些路线:是否可以在子类/接口中删除继承的字段/方法?
interface A {
a: number;
x: any;
}
interface B extends A {
b: number;
}
interface C {
a: number;
b: number;
}
所以B
就等于C
(省略场x
但仍延伸到A
)。可能吗?如果是这样,怎么样?
东西沿着这些路线:是否可以在子类/接口中删除继承的字段/方法?
interface A {
a: number;
x: any;
}
interface B extends A {
b: number;
}
interface C {
a: number;
b: number;
}
所以B
就等于C
(省略场x
但仍延伸到A
)。可能吗?如果是这样,怎么样?
在TypeScript中不可能删除接口的继承字段/方法。
但是你可以通过接口再造解决这个问题:
提取基本接口
interface BaseA {
a: number;
}
interface A extends Base A {
x: any;
}
interface B extends A {
b: number;
}
interface C extends BaseA {
b: number;
}
两个C
和B
将被强制转换为BaseA
。
使用可选字段
interface A {
a: number;
x?: any;
}
interface B extends A {
b: number;
}
interface C extends A {
b: number;
}
我敢肯定有依赖于某些任务上下文其他方式。
“由于继承概念原理,不可能删除子类/接口中的继承字段/方法。”是不真实的,继承不是子类型的。继承是关于代码重用的,我非常肯定,通过继承的定义,任何类型的更改都可能发生在子元素中,甚至是删除成员。第二段明确说明:https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming) – monnef
对不起,但我不能分享你的观点。我还没有发现直接提及后代界面的成员移除。 IMO界面是一个合同声明,因此子界面应该实现父界面合同。如果没有,父接口不实现。 – TSV
你容易混淆继承(一些部分可以用于儿童)和子类型(孩子可以扮演与父母相同的角色)。从维基:继承不应该与子类型混淆。[3] [4]在某些语言中,继承和子类型同意[a],而在其他语言中则不同;一般而言,子类型建立了一种is-a关系,而继承只重用实现并建立语法关系,而不一定是语义关系(继承不能确保行为分类)。 – monnef
你想通过这个实现什么?这看起来好像破坏了整个继承点。 –
@JamesHughes继承的大多数通用定义在“成员”上下文中使用“修改”而不是“仅添加”。 – monnef
是的,你可以修改它们,但我相当肯定修改不包括消除 –