আমি জানতে চাই যে পুরুষ ও শিশুর মিল কী এবং কীভাবে তাদের মধ্যে পার্থক্য রয়েছে।
class Person {
name: string;
age: number;
}
class child extends Person {}
class man implements Person {}
আমি জানতে চাই যে পুরুষ ও শিশুর মিল কী এবং কীভাবে তাদের মধ্যে পার্থক্য রয়েছে।
class Person {
name: string;
age: number;
}
class child extends Person {}
class man implements Person {}
উত্তর:
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
সম্পত্তি নাম আছে?
টাইপস্ক্রিপ্টে (এবং কিছু অন্যান্য ওও ভাষাগুলি) আপনার ক্লাস এবং ইন্টারফেস রয়েছে।
একটি ইন্টারফেসের কোনও বাস্তবায়ন নেই, এই ধরণের সদস্য / পদ্ধতিতে এটি কেবল একটি "চুক্তি"।
উদাহরণ স্বরূপ:
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
@ নাইটজান-টোমারের দুর্দান্ত উত্তর! আমাকে অনেক সাহায্য করেছে ... আমি তার ডেমোটি এর সাথে কিছুটা বাড়িয়েছি:
IPoint interface;
Point implements IPoint;
Point3D extends Point;
এবং তারা কীভাবে কোনও IPoint
ধরণের প্রত্যাশায় ফাংশনগুলিতে আচরণ করে ।
সুতরাং আমি এখন পর্যন্ত যা শিখেছি এবং একটি থাম্ব-রুল হিসাবে ব্যবহার করছি: আপনি যদি জেনেরিক ধরণের প্রত্যাশিত শ্রেণি এবং পদ্ধতিগুলি ব্যবহার করেন তবে প্রত্যাশিত প্রকার হিসাবে ইন্টারফেস ব্যবহার করুন। এবং নিশ্চিত করুন যে পিতামাতা বা বেস-ক্লাসটি সেই ইন্টারফেসটি ব্যবহার করে। সেভাবে আপনি ইন্টারফেসটি যতটা প্রয়োগ করেন ততগুলি সমস্ত উপশ্রেণী ব্যবহার করতে পারেন।
এখানে বর্ধিত ডেমো
extends
উত্তরাধিকারের উপর ফোকাস করুন এবং implements
ইন্টারফেস বা শ্রেণি কিনা তা সীমাবদ্ধতার উপর ফোকাস করুন।
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)