2016-07-08 11 views
1

In Typoskript ist diese Recht Code:Warum darf der geschützte Zugriff in einer Basisklasse für den öffentlichen Zugriff in einer abgeleiteten Klasse geändert werden?

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); 
    } 
} 

Dies würde jedoch beispielsweise in C#, illegal sein. In TypeScript ist das Wechseln von public zu protected jedoch nicht zulässig.

Was ist der Grund dafür, dass eine geschützte Funktion als öffentliche Funktion in einer abgeleiteten Klasse verfügbar gemacht wird? Aus C# und Java kommend ergibt es für mich keinen Sinn, die Zugriffsebene eines Mitglieds überhaupt ändern zu dürfen.

Antwort

1

Was für das Erlauben einer geschützten Funktion die Logik ist als eine öffentliche Funktion in einer abgeleiteten Klasse ausgesetzt werden

Es ist erlaubt, weil es nicht unzulässig. Du bekommst einfach das, was du schreibst (und da du das Kind nicht geschrieben hast, wurde es öffentlich, da das die Standardeinstellung ist).

Mehr

Sprache-Entwurf https://blogs.msdn.microsoft.com/ericgu/2004/01/12/minus-100-points/

von öffentlichem Going to geschützt ist nicht in Typoskript erlaubt, jedoch.

Aus gutem Grund. Betrachten Sie die folgenden

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

Klare Antwort, danke. – Sam

Verwandte Themen