2017-01-16 77 views
0

东西沿着这些路线:是否可以在子类/接口中删除继承的字段/方法?

interface A { 
    a: number; 
    x: any; 
} 

interface B extends A { 
    b: number; 
} 

interface C { 
    a: number; 
    b: number; 
} 

所以B就等于C(省略场x但仍延伸到A)。可能吗?如果是这样,怎么样?

+1

你想通过这个实现什么?这看起来好像破坏了整个继承点。 –

+0

@JamesHughes继承的大多数通用定义在“成员”上下文中使用“修改”而不是“仅添加”。 – monnef

+0

是的,你可以修改它们,但我相当肯定修改不包括消除 –

回答

1

在TypeScript中不可能删除接口的继承字段/方法。

但是你可以通过接口再造解决这个问题:

  1. 提取基本接口

    interface BaseA { 
        a: number; 
    } 
    
    interface A extends Base A { 
        x: any; 
    } 
    
    interface B extends A { 
        b: number; 
    } 
    
    interface C extends BaseA { 
        b: number; 
    } 
    

两个CB将被强制转换为BaseA

  • 使用可选字段

    interface A { 
        a: number; 
        x?: any; 
    } 
    
    interface B extends A { 
        b: number; 
    } 
    
    interface C extends A { 
        b: number; 
    } 
    
  • 我敢肯定有依赖于某些任务上下文其他方式。

    +0

    “由于继承概念原理,不可能删除子类/接口中的继承字段/方法。”是不真实的,继承不是子类型的。继承是关于代码重用的,我非常肯定,通过继承的定义,任何类型的更改都可能发生在子元素中,甚至是删除成员。第二段明确说明:https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming) – monnef

    +0

    对不起,但我不能分享你的观点。我还没有发现直接提及后代界面的成员移除。 IMO界面是一个合同声明,因此子界面应该实现父界面合同。如果没有,父接口不实现。 – TSV

    +0

    你容易混淆继承(一些部分可以用于儿童)和子类型(孩子可以扮演与父母相同的角色)。从维基:继承不应该与子类型混淆。[3] [4]在某些语言中,继承和子类型同意[a],而在其他语言中则不同;一般而言,子类型建立了一种is-a关系,而继承只重用实现并建立语法关系,而不一定是语义关系(继承不能确保行为分类)。 – monnef

    相关问题