টাইপস্ক্রিপ্টে 'প্রসারিত' এবং 'প্রয়োগসমূহ' এর মধ্যে পার্থক্য কী


126

আমি জানতে চাই যে পুরুষশিশুর মিল কী এবং কীভাবে তাদের মধ্যে পার্থক্য রয়েছে।

class Person {
  name: string;
  age: number;
}
class child extends Person {}
class man implements Person {}

1
এখানে সুন্দরভাবে ব্যাখ্যা করা হয়েছে: stackoverflow.com/a/35990799/452213 । বিশেষ করে উদাহরণ: typescriptlang.org/play/...
সুদীপ

উত্তর:


153

সংক্ষিপ্ত সংস্করণ

  • extends মাধ্যম:

নতুন বর্গ শিশু । এটি উত্তরাধিকারের সাথে বেনিফিট পায়। এটির প্যারেন্ট হিসাবে সমস্ত বৈশিষ্ট্য, পদ্ধতি রয়েছে। এটি এর কিছুটিকে ওভাররাইড করতে পারে এবং নতুন বাস্তবায়ন করতে পারে তবে প্যারেন্ট স্টাফ ইতিমধ্যে অন্তর্ভুক্ত is

  • implements মাধ্যম:

নতুন বর্গ হিসাবে গণ্য করা যেতে পারে একই "আকৃতি" সময়, এটা একটি শিশু নয় । এটি যে কোনও পদ্ধতিতে পাঠানো যেতে পারে যেখানে Personপ্রয়োজন তার চেয়ে আলাদা পিতা-মাতা থাকুক না কেনPerson

আরও ...

ইন গলি (সি #, জাভা মত ভাষা) আমরা ব্যবহার করেন

extendsউত্তরাধিকার থেকে লাভ ( উইকি দেখুন )। ছোট উক্তি:

... বেশিরভাগ শ্রেণিভিত্তিক অবজেক্ট-ওরিয়েন্টেড ভাষাগুলিতে উত্তরাধিকার হ'ল এমন একটি প্রক্রিয়া যাতে কোনও বস্তু প্যারেন্ট অবজেক্টের সমস্ত বৈশিষ্ট্য এবং আচরণ অর্জন করে। উত্তরাধিকার প্রোগ্রামারগুলিকে অনুমতি দেয়: বিদ্যমান ক্লাসগুলির উপর নির্মিত ক্লাস তৈরি করা ...

implementsপলিমারফিজমের জন্য আরও বেশি হবে ( উইকি দেখুন )। ছোট উক্তি:

... পলিমারফিজম হ'ল বিভিন্ন ধরণের প্রতিষ্ঠানের একক ইন্টারফেসের বিধান ...

সুতরাং, আমরা আমাদের সত্যিই বিভিন্ন উত্তরাধিকার গাছ থাকতে পারে class Man

class Man extends Human ...

তবে আমরা যদি ঘোষণাও করি যে আমরা অন্য ধরণের বলে ভান করতে পারি - Person:

class Man extends Human 
          implements Person ...

.. তাহলে আমরা এটি যে কোনও জায়গায় ব্যবহার করতে পারি, যেখানে Personপ্রয়োজন হয়। আমাদের কেবল ব্যক্তির "interface" (যেমন এর সমস্ত পাবলিক স্টাফ বাস্তবায়ন করা) পূরণ করতে হবে ।

implementঅন্য শ্রেণি? এটা সত্যিই দুর্দান্ত জিনিস

জাভাস্ক্রিপ্টের সুন্দর মুখ (সুবিধাগুলির মধ্যে একটি) হ'ল বিল্ড ইন ডাক টাইপিংয়ের সমর্থন ( উইকি দেখুন )। ছোট উক্তি:

"এটি যদি হাঁসের মতো হাঁটতে থাকে এবং এটি হাঁসের মতো কোঁক করে থাকে তবে অবশ্যই এটি হাঁস হতে হবে।"

সুতরাং, জাভাস্ক্রিপ্টে, যদি দুটি ভিন্ন ভিন্ন অবজেক্টের ... একই ধরণের পদ্ধতি থাকে (যেমন render()) তারা এমন কোনও ফাংশনে যেতে পারে যা এটি আশা করে:

function(engine){
  engine.render() // any type implementing render() can be passed
}

এটি হারাতে না - আমরা টাইপস্ক্রিপ্টে আরও একইভাবে করতে পারি - আরও টাইপ করা সমর্থন সহ। এবং যে যেখানে

class implements class

এর ভূমিকা আছে, যেখানে এটি উপলব্ধি করে

ওওপি ভাষায় যেমন C#... এটি করার কোনও উপায় নেই ...

এছাড়াও ডকুমেন্টেশনের এখানে সহায়তা করা উচিত:

ইন্টারফেস বর্ধমান শ্রেণি

যখন কোনও ইন্টারফেস প্রকার শ্রেণীর প্রকার প্রসারিত করে তখন শ্রেণীর সদস্যদের উত্তরাধিকার সূত্রে প্রাপ্ত হয় তবে তাদের বাস্তবায়ন নয়। এটা যেন ইন্টারফেসটি ক্লাসের সমস্ত সদস্যকে কোনও বাস্তবায়ন না করেই ঘোষণা করেছিল। ইন্টারফেসগুলি এমনকি বেস শ্রেণীর ব্যক্তিগত এবং সুরক্ষিত সদস্যদের উত্তরাধিকার সূত্রে প্রাপ্ত হয়। এর অর্থ হ'ল আপনি যখন একটি ইন্টারফেস তৈরি করেন যা ব্যক্তিগত বা সুরক্ষিত সদস্যদের সাথে কোনও শ্রেণি প্রসারিত করে, সেই ইন্টারফেসের ধরণটি কেবলমাত্র সেই শ্রেণি বা এর একটি সাবক্লাস দ্বারা প্রয়োগ করা যেতে পারে।

যখন আপনার একটি বৃহত্তর উত্তরাধিকারের স্তরক্রম থাকে তবে এটি কার্যকর হয় তবে আপনার কোডটি নির্দিষ্ট বৈশিষ্ট্যযুক্ত কেবল সাবক্লাসের সাথে কাজ করে তা নির্দিষ্ট করতে চায়। বেস ক্লাস থেকে উত্তরাধিকার সূত্রে সাবক্লাসগুলি সম্পর্কিত হতে হবে না। উদাহরণ স্বরূপ:

class Control {
    private state: any;
}

interface SelectableControl extends Control {
    select(): void;
}

class Button extends Control implements SelectableControl {
    select() { }
}

class TextBox extends Control {
    select() { }
}

// Error: Property 'state' is missing in type 'Image'.
class Image implements SelectableControl {
    private state: any;
    select() { }
}

class Location {

}

সুতরাং, যখন

  • extends অর্থ - এটি সব তার পিতামাতার কাছ থেকে পাওয়া যায়
  • implementsএই ক্ষেত্রে প্রায় একটি ইন্টারফেস বাস্তবায়ন মত। শিশু অবজেক্টটি এটি পিতামাতার ভান করতে পারে ... তবে এটি কোনও বাস্তবায়ন পায় না

যখন আপনি বলছেন " extends-ইটি তার পিতামাতার কাছ থেকে সব পাওয়া যায়", তখন এটি কি ব্যক্তিগত সদস্যদের জন্য প্রযোজ্য? উদাহরণ হিসেবে বলা যায় class Person {private name: string} class man extends Person{gender: string;}না manসম্পত্তি নাম আছে?
ডেভেজোম

বেসরকারী পাশাপাশি আছে। টিএস দ্বারা কেবল অ্যাক্সেসযোগ্য। এগুলি সুরক্ষিত করুন এবং আপনি সেগুলি ব্যবহার করতে পারেন। "প্রয়োগকারী" ক্ষেত্রে জনসাধারণের পক্ষ থেকে বোঝা যায়। আশা করি এটি কিছুটা সাহায্য করবে
Radim Köhler

দুর্দান্ত উত্তর। "ব্যক্তিগত আছে তবে টিএস দ্বারা অ্যাক্সেসযোগ্য নয়" এর জন্য আপনার মন্তব্যে ঠিক নিশ্চিত হন না। আপনি কি বলতে চান যে সদ্য তৈরি হওয়া শিশু অবজেক্টে ব্যক্তিগত সম্পত্তিগুলি অনুলিপি করা হয়েছে? এবং প্রয়োগের ক্ষেত্রে, কেবলমাত্র সরকারী সম্পত্তি অনুলিপি করা হয়?
কুশলভম

এছাড়াও, আমি আরও একটি পয়েন্ট পেয়েছিলাম। যদি এটি প্রসারিত সংজ্ঞা হয়। তারপর যদি এই ব্যাখ্যা হতে পারে সন্তুষ্ট stackoverflow.com/questions/60390454/...
kushalvm

96

টাইপস্ক্রিপ্টে (এবং কিছু অন্যান্য ওও ভাষাগুলি) আপনার ক্লাস এবং ইন্টারফেস রয়েছে।

একটি ইন্টারফেসের কোনও বাস্তবায়ন নেই, এই ধরণের সদস্য / পদ্ধতিতে এটি কেবল একটি "চুক্তি"।
উদাহরণ স্বরূপ:

interface Point {
    x: number;
    y: number;
    distance(other: Point): number;
}

এই Pointইন্টারফেসটি প্রয়োগকারী উদাহরণগুলির মধ্যে টাইপ সংখ্যার দুটি সদস্য থাকতে হবে: xএবং y, এবং এমন একটি পদ্ধতি distanceযা অন্য Pointউদাহরণ গ্রহণ করে এবং a প্রদান করে number
ইন্টারফেস এগুলির কোনও প্রয়োগ করে না।

ক্লাসগুলি বাস্তবায়ন:

class PointImplementation implements Point {
    public x: number;
    public y: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }

    public distance(other: Point): number {
        return Math.sqrt(Math.pow(this.x - other.x, 2) + Math.pow(this.y - other.y, 2));
    }
}

( খেলার মাঠে কোড )

উদাহরণস্বরূপ আপনি Personযখন আপনার বর্গকে প্রসারিত করেন তখন একবার আপনার ক্লাস হিসাবে এবং একবার এটি প্রয়োগ করার সময় একটি ইন্টারফেস হিসাবে বিবেচনা করেন।
তোমার গোপন সংকেত:

class Person {
    name: string;
    age: number;
}
class Child  extends Person {}

class Man implements Person {}

একটি সংকলন ত্রুটিযুক্ত হয়েছে:

শ্রেণি 'ম্যান' ভুলভাবে ইন্টারফেস 'ব্যক্তি' প্রয়োগ করে।
সম্পত্তি 'নাম' টাইপ 'ম্যান' এ অনুপস্থিত।

এবং এটি কারণ ইন্টারফেস বাস্তবায়ন অভাব।
সুতরাং আপনি যদি implementকোনও শ্রেণি হন তবে আপনি কেবল বাস্তবায়ন ব্যতিরেকে এর "চুক্তি" গ্রহণ করেন, সুতরাং আপনার এটি করা দরকার:

class NoErrorMan implements Person {
    name: string;
    age: number;
}

( খেলার মাঠে কোড )

নীচের লাইনটি হল বেশিরভাগ ক্ষেত্রে আপনি extendঅন্য শ্রেণিতে চান এবং implementএটি না to


7
এই উত্তরটি বুঝতে সহজ।
অক্ষয় রাউত

6

@ নাইটজান-টোমারের দুর্দান্ত উত্তর! আমাকে অনেক সাহায্য করেছে ... আমি তার ডেমোটি এর সাথে কিছুটা বাড়িয়েছি:

IPoint interface;
Point implements IPoint;
Point3D extends Point;

এবং তারা কীভাবে কোনও IPointধরণের প্রত্যাশায় ফাংশনগুলিতে আচরণ করে ।

সুতরাং আমি এখন পর্যন্ত যা শিখেছি এবং একটি থাম্ব-রুল হিসাবে ব্যবহার করছি: আপনি যদি জেনেরিক ধরণের প্রত্যাশিত শ্রেণি এবং পদ্ধতিগুলি ব্যবহার করেন তবে প্রত্যাশিত প্রকার হিসাবে ইন্টারফেস ব্যবহার করুন। এবং নিশ্চিত করুন যে পিতামাতা বা বেস-ক্লাসটি সেই ইন্টারফেসটি ব্যবহার করে। সেভাবে আপনি ইন্টারফেসটি যতটা প্রয়োগ করেন ততগুলি সমস্ত উপশ্রেণী ব্যবহার করতে পারেন।

এখানে বর্ধিত ডেমো


এটি প্রশ্নের উত্তর দেয় না। কোনও লেখকের কাছ থেকে সমালোচনা বা স্পষ্টতার জন্য অনুরোধ জানাতে, তাদের পোস্টের নীচে একটি মন্তব্য দিন। - পর্যালোচনা থেকে
aronisstav

1
@ অ্যারনিস্টাভ আমি ইতিমধ্যে আমাকে যে উত্তম উত্তরটি পেয়েছি সে সম্পর্কে আমি কেবল একটি বর্ধিত ডেমো পোস্ট করেছি। তবে সম্ভবত অন্য কেউ ডেমোটি কার্যকর করার জন্য আমার কাজটি খুঁজে পেয়েছিল। এখানেই শেষ. মন্তব্যগুলি আসলে কোনও কোড-ব্লক দেওয়ার জন্য নয়, তাই আমি উত্তর-পোস্টে এটি আরও ভাল বোধ করি। তাহলে এতে সমস্যা কী?
andzep

আপনার উত্তরটি (স্বয়ংক্রিয়ভাবে?) দৈর্ঘ্য এবং সামগ্রীর কারণে পতাকাঙ্কিত হয়েছিল, আমার পর্যালোচনা সারিতে হাজির হয়েছিল এবং আমি পতাকাটিতে উপস্থাপিত কারণগুলির জন্য যোগ্যতা দিয়েছি। এর প্রধান অবদান (আপনি ডেমোটি প্রসারিত করেছেন তা বোঝানো) একটি মন্তব্য হিসাবে ভাল হবে। যুক্ত অনুচ্ছেদে সম্ভবত এটি আরও কার্যকর।
অ্যারনিস্টাভ

@ এবং আপনার প্রসারিত ডেমো উদাহরণটি সত্যই সহায়ক।
নমিত

3
  1. ইন্টারফেস আকারের সাথে ইন্টারফেস প্রসারিত করে
  2. ইন্টারফেস আকার সহ শ্রেণি প্রসারিত করে
  3. শ্রেণি প্রয়োগকারী ইন্টারফেসের ইন্টারফেস দ্বারা সরবরাহিত সমস্ত ক্ষেত্র প্রয়োগ করা উচিত
  4. শ্রেণি আকৃতি সহ শ্রেণি প্রয়োগ করে
  5. শ্রেণি সমস্ত ক্ষেত্র সহ শ্রেণি প্রসারিত করে

extendsউত্তরাধিকারের উপর ফোকাস করুন এবং implementsইন্টারফেস বা শ্রেণি কিনা তা সীমাবদ্ধতার উপর ফোকাস করুন।


0

ভিএস সরঞ্জামগুলি প্রসারিত করে

  • extends: শিশু শ্রেণি (যা প্রসারিত) শ্রেণীর সমস্ত সম্পত্তি এবং পদ্ধতি বর্ধিত হওয়ার উত্তরাধিকারী হবে
  • implements: implementsকীওয়ার্ডটি ব্যবহার করে এমন শ্রেণীর জন্য শ্রেণীর সমস্ত বৈশিষ্ট্য এবং পদ্ধতিটি প্রয়োগ করা দরকার যা এটিimplements

আরও সহজ শর্তাবলী:

  • extends: আপনি এখানে অভিভাবক শ্রেণীর কাছ থেকে এই সমস্ত পদ্ধতি / বৈশিষ্ট্যগুলি পান যাতে আপনার নিজের এটি প্রয়োগ করতে হবে না
  • implements: এখানে একটি চুক্তি রয়েছে যা ক্লাসটি অনুসরণ করতে হয়। শ্রেণিকে কমপক্ষে নিম্নলিখিত পদ্ধতি / বৈশিষ্ট্য প্রয়োগ করতে হবে

উদাহরণ:

class Person {
  name: string;
  age: number;

  walk(): void {
    console.log('Walking (person Class)')
  }

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}
class child extends Person { }

// Man has to implements at least all the properties
// and methods of the Person class
class man implements Person {
  name: string;
  age: number

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  walk(): void {
    console.log('Walking (man class)')
  }

}

(new child('Mike', 12)).walk();
// logs: Walking(person Class)

(new man('Tom', 12)).walk();
// logs: Walking(man class)

উদাহরণে আমরা পর্যবেক্ষণ করতে পারি যে শিশু শ্রেণি ব্যক্তি থেকে সমস্ত কিছু উত্তরাধিকার সূত্রে প্রাপ্ত হয় যেখানে পুরুষ শ্রেণিকে ব্যক্তি থেকে সমস্ত কিছু প্রয়োগ করতে হয়।

যদি আমরা উদাহরণস্বরূপ ওয়াক পদ্ধতি থেকে মেন ক্লাস থেকে কিছু সরিয়ে ফেলতে পারি তবে নিম্নলিখিত সংকলন সময় ত্রুটিটি পেয়ে যাব :

শ্রেণি 'মানুষ' ভুলভাবে শ্রেণি 'ব্যক্তি' প্রয়োগ করে। আপনি কি 'ব্যক্তি' প্রসারিত এবং সাবক্লাস হিসাবে এর সদস্যদের উত্তরাধিকারী করার অর্থ দিয়েছিলেন? সম্পত্তি 'ওয়াক' 'টাইপ' ম্যান 'এ অনুপস্থিত তবে' ব্যক্তি 'টাইপের ক্ষেত্রে প্রয়োজনীয় ((2720)

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