2016-07-08 83 views
1

在打字稿這是合法的代碼:爲什麼要將基類中的受保護訪問更改爲派生類中的公共訪問權限?

class Animal { 
    name: string; 

    constructor(theName: string) { 
     this.name = theName; 
    } 

    protected move(distanceInMeters: number = 0) { 
     console.log(`${this.name} moved ${distanceInMeters}m.`); 
    } 
} 

class Snake extends Animal { 
    constructor(name: string) { 
     super(name); 
    } 

    move(distanceInMeters = 5) { 
     console.log("Slithering..."); 
     super.move(distanceInMeters); 
    } 
} 

class Horse extends Animal { 
    constructor(name: string) { 
     super(name); 
    } 

    move(distanceInMeters = 45) { 
     console.log("Galloping..."); 
     super.move(distanceInMeters); 
    } 
} 

然而,這將是在C#中是非法的,例如。然而,在公共文件中保護是不允許的。

允許將受保護的函數作爲派生類中的公共函數公開的原因是什麼?從C#和Java開始,我根本無法改變成員的訪問級別。

回答

1

什麼是允許的保護功能的基本原理在派生類中

它允許的,因爲它不是不允許公開爲公共職能。你只是簡單地得到你寫的東西(因爲你沒有寫這個孩子變成公開的,因爲這是默認的)。

更多

語言設計https://blogs.msdn.microsoft.com/ericgu/2004/01/12/minus-100-points/

去從公衆對保護不打字稿,但是允許的。

有充分的理由。考慮以下內容

class Animal { 
    name: string; 

    constructor(theName: string) { 
     this.name = theName; 
    } 

    move(distanceInMeters: number = 0) { 
     console.log(`${this.name} moved ${distanceInMeters}m.`); 
    } 
} 

class Snake extends Animal { 
    constructor(name: string) { 
     super(name); 
    } 

    protected move(distanceInMeters = 5) { // If allowed 
     console.log("Slithering..."); 
     super.move(distanceInMeters); 
    } 
} 

let snake = new Snake('slitherin'); 
snake.move(); // ERROR 
let foo: Animal = snake; 
foo.move(); // HAHA made my way around the error! 
+0

明確的答案,謝謝。 – Sam

相關問題