2016-07-08 2 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#, например. Однако переход от общедоступного к защищенному не допускается в TypeScript.

Какое обоснование разрешено защищать функцию как открытую функцию в производном классе? Исходя из 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

Смежные вопросы