it-swarm.dev

الوصول إلى عضو الفئة الأساسية

انظر مثال الميراث من الملعب على موقع TypeScript:

class Animal {
    public name;
    constructor(name) { 
        this.name = name;
    }
    move(meters) {
        alert(this.name + " moved " + meters + "m.");
    }
}

class Snake extends Animal {
    constructor(name) { super(name); }
    move() {
        alert("Slithering...");
        super.move(5);
    }
}

class Horse extends Animal {
    constructor( name) { super(name); }
    move() {
        alert(super.name + " is Galloping...");
        super.move(45);
    }
}

var sam = new Snake("Sammy the Python")
var tom: Animal = new Horse("Tommy the Palomino")

sam.move()
tom.move(34)

لقد قمت بتغيير سطر واحد من التعليمات البرمجية: التنبيه في Horse.move(). أريد الوصول إلى super.name هناك ، لكن هذا يعود فقط undefined. يقترح IntelliSense أن أتمكن من استخدامه وأن برنامج TypeScript يقوم بترجمة بشكل جيد ، لكنه لا يعمل.

أيه أفكار؟

100
Jaap

مثال العمل. ملاحظات أدناه.

class Animal {
    constructor(public name) {
    }

    move(meters) {
        alert(this.name + " moved " + meters + "m.");
    }
}

class Snake extends Animal {
    move() {
        alert(this.name + " is Slithering...");
        super.move(5);
    }
}

class Horse extends Animal {
    move() {
        alert(this.name + " is Galloping...");
        super.move(45);
    }
}

var sam = new Snake("Sammy the Python");
var tom: Animal = new Horse("Tommy the Palomino");

sam.move();
tom.move(34);
  1. لا تحتاج إلى تعيين الاسم يدويًا لمتغير عام. باستخدام public name في تعريف المنشئ يفعل هذا لك.

  2. لا تحتاج إلى الاتصال بـ super(name) من الفصول المتخصصة.

  3. باستخدام this.name يعمل.

ملاحظات حول استخدام super.

يتم تغطية هذا بمزيد من التفصيل في القسم 4.9.2 من مواصفات اللغة.

سلوك الفئات الموروثة من Animal لا يختلف عن سلوك اللغات الأخرى. تحتاج إلى تحديد الكلمة الأساسية super لتفادي الخلط بين دالة متخصصة ووظيفة الفئة الأساسية. على سبيل المثال ، إذا قمت بالاتصال بـ move() أو this.move() ، فستتعامل مع الدالة المتخصصة Snake أو Horse ، لذا فإن استخدام super.move() يستدعي وظيفة الفئة الأساسية بوضوح.

لا يوجد أي تشويش في الخصائص ، لأنها خصائص المثيل. لا يوجد فرق بين super.name و this.name - هناك ببساطة this.name. بخلاف ذلك ، يمكنك إنشاء حصان له أسماء مختلفة بناءً على ما إذا كنت في الفصل المتخصص أو الفصل الأساسي.

152
Fenton