বেস ক্লাসের সদস্য অ্যাক্সেস করা


118

টাইপস্ক্রিপ্ট সাইটে খেলার মাঠ থেকে উত্তরাধিকারের উদাহরণটি দেখুন:

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। ইন্টেলিসেন্স পরামর্শ দিচ্ছে যে আমি এটি ব্যবহার করতে পারি এবং টাইপস্ক্রিপ্ট জরিমানা সংকলন করে, তবে এটি কার্যকর হয় না।

কোন ধারনা?

উত্তর:


179

কাজের উদাহরণ। নীচে নোট।

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।

ভাষা স্পেসিফিকেশনের ৪.৯.২ বিভাগে এটি আরও বিশদে আচ্ছাদিত ।

শ্রেণিগুলির উত্তরাধিকার সূত্রে প্রাপ্ত Animalআচরণ অন্য ভাষার ব্যবহারের সাথে আলাদা নয়। superবিশেষায়িত ফাংশন এবং বেস ক্লাস ফাংশনের মধ্যে বিভ্রান্তি এড়াতে আপনাকে কীওয়ার্ডটি নির্দিষ্ট করতে হবে specify উদাহরণস্বরূপ, যদি আপনি কল করেছেন move()বা this.move()আপনি বিশেষায়িত Snakeবা Horseফাংশন নিয়ে কাজ করছেন, সুতরাং super.move()স্পষ্টভাবে বেস ক্লাস ফাংশনটি কল করে।

বৈশিষ্ট্যের কোনও বিভ্রান্তি নেই, কারণ এগুলি উদাহরণের বৈশিষ্ট্য। তার মাঝে কোন পার্থক্য নেই super.nameএবং this.nameসেখানে কেবল হয় - this.name। অন্যথায় আপনি একটি বিশেষত শ্রেণিতে বা বেস শ্রেণিতে ছিলেন কিনা তার উপর নির্ভর করে আপনি একটি ঘোড়া তৈরি করতে পারেন যার বিভিন্ন নাম ছিল।


দুর্দান্ত উত্তর, এবং ভাষা নির্দিষ্টকরণের রেফারেন্সের জন্য ধন্যবাদ। আপনি কি কোনও দলিল সম্পর্কে সচেতন হন, উদাহরণস্বরূপ, বেস শ্রেণীর সম্পত্তি অ্যাক্সেসরগুলি অনুভূত শ্রেণীর (পদ্ধতিগুলি হিসাবে) ওভাররাইডিং অ্যাকসেসরের মাধ্যমে ভার্চুয়ালাইজড এবং অ্যাক্সেসযোগ্য নয়?
— ডেভিড কচিয়া

অধ্যায় 4.8 অধ্যায় অবধি লেখা সমস্ত কিছুকে কভার করে - এটি "এই কারণেই" না হয়ে এটি "এই আচরণ" হতে থাকে tend
— ফেনটন

3
ধন্যবাদ স্টিভ ফেন্টন আমি এখানেও অনুরূপ আলোচনার জন্য হোঁচট খেয়েছি : টাইপসক্রিপ্টকোডেপ্লেক্স / ডিস্কিউশনস / ৪১৪৪৩৩৯ । ভাষাতে ভারসাম্যহীন বলে মনে হয়; আমার অনুমান যে জাভাস্ক্রিপ্ট সমর্থনের অভাবকে ক্ষতিপূরণ দেওয়ার জন্য "কাজের আশেপাশে" সহায়ক পদ্ধতিগুলির বিপরীতে নির্গত জাভাস্ক্রিপ্টটি সহজ রাখার সিদ্ধান্ত নেওয়া হয়েছিল।
— ডেভিড কচিয়া

1

আপনি superএবং thisকীওয়ার্ডটি ভুলভাবে ব্যবহার করছেন । তারা কীভাবে কাজ করে তার উদাহরণ এখানে:

class Animal {
    public name: string;
    constructor(name: string) { 
        this.name = name;
    }
    move(meters: number) {
        console.log(this.name + " moved " + meters + "m.");
    }
}

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

var tom: Animal = new Horse("Tommy the Palomino");

Animal.prototype.name = 'horseee'; 

tom.move(34);
// Outputs:

// horseee is Galloping...
// Tommy the Palomino is Galloping...
// Tommy the Palomino moved 45m.

ব্যাখ্যা:

  1. প্রথম লগ আউটপুট super.name, এটি উল্লেখ করে প্রোটোটাইপ শৃঙ্খল বস্তুর tomবস্তু নয় tomস্ব। যেহেতু আমরা একটি নাম সম্পত্তি যুক্ত করেছি Animal.prototype, ঘোড়া আউটপুট হবে।
  2. দ্বিতীয় লগ আউটপুট this.name, thisকীওয়ার্ডটি টম অবজেক্টকেই বোঝায়।
  3. তৃতীয় লগটি moveঅ্যানিম্যাল বেস ক্লাসের পদ্ধতিটি ব্যবহার করে লগ হয় । এই পদ্ধতিটি সিনট্যাক্স সহ ঘোড়া শ্রেণীর সরানো পদ্ধতি থেকে কল করা হয় super.move(45);। ব্যবহার করেsuperএই প্রসঙ্গে কীওয়ার্ডটিmove প্রোটোটাইপ শৃঙ্খলে এমন একটি পদ্ধতির সন্ধান করা হবে যা অ্যানিমাল প্রোটোটাইপে পাওয়া যায়।

মনে রাখবেন টিএস এখনও হুডের নীচে প্রোটোটাইপ ব্যবহার করে classএবং extendsকীওয়ার্ডগুলি প্রোটোটাইপিক উত্তরাধিকারের তুলনায় কেবল সিনট্যাকটিক চিনি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.