জাভাস্ক্রিপ্টের ইন্টারফেসের ধরণ রয়েছে (যেমন জাভার 'ইন্টারফেস')?


324

আমি জাভাস্ক্রিপ্ট দিয়ে কীভাবে ওওপি তৈরি করব তা শিখছি । এটির কি ইন্টারফেস ধারণা (যেমন জাভা interface) রয়েছে?

সুতরাং আমি শ্রোতা তৈরি করতে সক্ষম হব ...


18
আরও বিকল্প খুঁজছেন তাদের জন্য, টাইপ করা বিষয় আছে ইন্টারফেসগুলি
এসডি

2
আপনি ভ্যানিলা জেএস ব্যবহার করতে চাইলে আর একটি বিকল্প হ'ল বাস্তবায়ন.জেএস , যেমন এখানে
রিচার্ড লাভল

উত্তর:


648

"এই শ্রেণীর এই ফাংশনগুলি অবশ্যই থাকতে হবে" এর কোনও ধারণা নেই (এটি প্রতি সেফের জন্য কোনও ইন্টারফেস নয়), কারণ:

  1. জাভাস্ক্রিপ্ট উত্তরাধিকার ক্লাস নয়, অবজেক্টের উপর ভিত্তি করে। যতক্ষণ না আপনি উপলব্ধি করেন এটি কোনও বড় বিষয় নয়:
  2. জাভাস্ক্রিপ্ট একটি চূড়ান্তভাবে টাইপ করা ভাষা - আপনি সঠিক পদ্ধতিগুলির সাহায্যে একটি অবজেক্ট তৈরি করতে পারেন, যা এটি ইন্টারফেসের সাথে সামঞ্জস্য করবে এবং তারপরে এটি উপযুক্ত সমস্ত জিনিসই অপরিবর্তিত করবে । টাইপ সিস্টেমটি বিকৃত করা এত সহজ হবে - এমনকি দুর্ঘটনাক্রমে! - এটি চেষ্টা করে প্রথমে একটি টাইপ সিস্টেম তৈরি করা উপযুক্ত হবে না।

পরিবর্তে, জাভাস্ক্রিপ্ট ডক টাইপিং যাকে বলে ব্যবহার করে । (যদি এটি হাঁসের মতো হাঁটতে থাকে এবং হাঁসের মতো কোঁক দেয়, জেএস যতটা যত্নশীল, এটি একটি হাঁস।) যদি আপনার অবজেক্টের কোয়াক (), হাঁটা () এবং ফ্লাই () পদ্ধতি থাকে তবে কোডটি যেখানে আশা করবে সেখানে এটি ব্যবহার করতে পারে এমন কোনও বস্তু যা কিছু "ডাকযোগ্য" ইন্টারফেস প্রয়োগের প্রয়োজন ছাড়াই হাঁটতে, কোঁকতে এবং উড়তে পারে। ইন্টারফেসটি হ'ল কোডটি যে ফাংশনগুলির সেট করে (এবং সেই ফাংশনগুলি থেকে ফেরতের মানগুলি) এবং হাঁসের টাইপিংয়ের সাথে আপনি এটি নিখরচায় পাবেন।

এখন, এটি বলার অপেক্ষা রাখে না যে আপনি কোড দেওয়ার চেষ্টা করলে আপনার কোডটি অর্ধেক পেরিয়ে যাবে না some_dog.quack(); আপনি একটি টাইপরর পাবেন। সত্যই, যদি আপনি কুকুরকে কোমল করতে বলছেন তবে আপনার কিছুটা বড় সমস্যা রয়েছে; আপনি আপনার সমস্ত হাঁসকে একটানা রাখলে হাঁসের টাইপিং সবচেয়ে ভাল কাজ করে, তাই বলার জন্য এবং কুকুর এবং হাঁসকে একত্রে মিশ্রিত করতে দিচ্ছেন না যদি আপনি তাদের সাথে জেনেরিক প্রাণী হিসাবে ব্যবহার না করেন। অন্য কথায়, ইন্টারফেসটি তরল হলেও এটি এখনও রয়েছে; কোডটিতে কোনও কুকুরকে পাস করার ক্ষেত্রে এটি প্রায়শই ত্রুটি হয় যা এটি প্রথম স্থানটিতে উড়ে বেড়াতে এবং উড়ে যাওয়ার আশা করে।

তবে আপনি যদি নিশ্চিত হন যে আপনি সঠিক কাজটি করছেন তবে আপনি কোয়াকিং-কুকুর সমস্যাটি ব্যবহার করার চেষ্টা করার আগে কোনও নির্দিষ্ট পদ্ধতির অস্তিত্বের জন্য পরীক্ষা করে কাজ করতে পারেন। কিছুটা এইরকম

if (typeof(someObject.quack) == "function")
{
    // This thing can quack
}

সুতরাং আপনি যে সমস্ত পদ্ধতি ব্যবহার করতে পারেন সেগুলি ব্যবহারের আগে আপনি যাচাই করতে পারেন। যদিও সিনট্যাক্সটি এক রকম কুৎসিত। কিছুটা সুন্দর উপায় আছে:

Object.prototype.can = function(methodName)
{
     return ((typeof this[methodName]) == "function");
};

if (someObject.can("quack"))
{
    someObject.quack();
}

এটি স্ট্যান্ডার্ড জাভাস্ক্রিপ্ট, সুতরাং এটি ব্যবহার করার মতো কোনও জেএস ইন্টারপ্রেটারে কাজ করা উচিত। এটির মতো ইংরেজি পড়ার অতিরিক্ত সুবিধা রয়েছে।

আধুনিক ব্রাউজারগুলির জন্য (এটি, আইআই 6-8 ব্যতীত অন্য কোনও ব্রাউজার), সম্পত্তিটি প্রদর্শিত না হতে পারে এমন উপায়ও রয়েছে for...in:

Object.defineProperty(Object.prototype, 'can', {
    enumerable: false,
    value: function(method) {
        return (typeof this[method] === 'function');
    }
}

সমস্যাটি হ'ল আই 7 আইটেমগুলির মোটেও নেই .definePropertyএবং আই 8 তে এটি অভিযোগ করা হয়েছে কেবল হোস্ট অবজেক্টগুলিতে (এটি, ডোম উপাদান এবং এ জাতীয়)। সামঞ্জস্যতা যদি কোনও সমস্যা হয় তবে আপনি ব্যবহার করতে পারবেন না .defineProperty। (আমি আই আই mention এর উল্লেখও করব না, কারণ এটি চীন এর বাইরে আর অপ্রাসঙ্গিক)

আর একটি সমস্যা হ'ল কিছু কোডিং শৈলীর ধারণা ধরে নেওয়া পছন্দ করে যে প্রত্যেকে খারাপ কোড লিখেছেন এবং Object.prototypeকেউ অন্ধভাবে ব্যবহার করতে চান এমন ক্ষেত্রে সংশোধন করতে নিষেধ করেছেন for...in। আপনি যদি সে সম্পর্কে যত্নশীল হন বা (আইএমও ভাঙ্গা ) কোড ব্যবহার করছেন যা কিছুটা আলাদা সংস্করণ ব্যবহার করে দেখুন:

function can(obj, methodName)
{
     return ((typeof obj[methodName]) == "function");
}

if (can(someObject, "quack"))
{
    someObject.quack();
}

7
এটি যতটা ভয়ঙ্কর তা তৈরি করা যায়নি। for...inহ'ল - এবং সর্বদা - এই জাতীয় বিপদগুলির সাথে পরিপূর্ণ এবং যে কেউ এটি অন্তত বিবেচনা না করেই এটি করে যে কেউ Object.prototype( যে কোনও অনুপযুক্ত কৌশল নয়, সেই নিবন্ধটির নিজস্ব ভর্তি দিয়ে) অন্য কারও হাতে তাদের কোড বিরতি দেখতে পাবে।
সিএওও

1
@ এন্টোনিও: আমি বিল্ট-ইন টাইপগুলির ক্ষতিকারকতাটিকে কোনও সমস্যার চেয়ে বৈশিষ্ট্য হিসাবে বিবেচনা করব । এটি শিমস / পলিফিলগুলি সম্ভাব্য করে তোলে তার একটি বড় অংশ। এটি ব্যতীত, আমরা হয় সমস্ত-অন্তর্নিহিত সাব-টাইপগুলি সম্ভাব্য-বেমানান উপ-টাইপের সাথে আবৃত করতাম বা সর্বজনীন ব্রাউজার সমর্থনের জন্য অপেক্ষা করতাম (যা কখনই আসতে পারে না, যখন ব্রাউজারগুলি স্টাফ সমর্থন করে না তখন লোকেরা এটি ব্যবহার না করে কারণ এটি ব্রাউজারগুলি ডন না করে ' এটি সমর্থন করুন)। যেহেতু অন্তর্নির্মিত প্রকারগুলি সংশোধন করা যেতে পারে, আমরা তার পরিবর্তে কেবলমাত্র অস্তিত্ব নেই এমন অনেকগুলি কার্যাদি যুক্ত করতে পারি।
সিএওও

1
জাভাস্ক্রিপ্টের শেষ সংস্করণে (1.8.5) আপনি কোনও বস্তুর সম্পত্তি গণনাযোগ্য না হিসাবে সংজ্ঞায়িত করতে পারেন । এইভাবে আপনি for...inসমস্যা এড়াতে পারেন । বিকাশকারী.মোজিলা.আর.ইন-
টমাস প্রডো

1
@ টমস: দুঃখের বিষয়, যতক্ষণ না প্রতিটি ব্রাউজার ইএস 5 এর সাথে সামঞ্জস্যপূর্ণ কিছু চালাচ্ছে, তবুও আমাদের এই জাতীয় জিনিসগুলি নিয়ে চিন্তিত হতে হবে। এবং তারপরেও, " for...inসমস্যা" এখনও কিছুটা অবধি থাকবে, কারণ সেখানে সর্বদা opিপি কোড থাকবে ... ভাল, এটি, এবং Object.defineProperty(obj, 'a', {writable: true, enumerable: false, value: 3});এটি কেবল বিচারের চেয়ে কিছুটা বেশি কাজ obj.a = 3;। লোকেরা এটি প্রায়শই বুঝতে পারে যে এটি প্রায়শই না করার চেষ্টা করে। : পি
সিএইচও

1
হেই ... "স্পষ্টভাবে বলুন, আপনি যদি কুকুরকে কোমল করতে বলছেন তবে আপনার কিছুটা বড় সমস্যা রয়েছে languages ​​ভাষাগুলি বোকামি এড়ানোর চেষ্টা করা উচিত হবে না তা দেখানোর জন্য দুর্দান্ত উপমা That's এটি সর্বদা একটি হারানো লড়াই
স্কট

72

ডাস্টিন ডিয়াজের ' জাভাস্ক্রিপ্ট ডিজাইনের ধরণগুলির ' একটি অনুলিপি নিন । হাঁসের টাইপিংয়ের মাধ্যমে জাভাস্ক্রিপ্ট ইন্টারফেস প্রয়োগের জন্য উত্সর্গীকৃত কয়েকটি অধ্যায় রয়েছে। এটি পাশাপাশি একটি দুর্দান্ত পড়া। তবে না, কোনও ইন্টারফেসের কোনও ভাষা নেটিভ বাস্তবায়ন নেই, আপনাকে হাঁসের প্রকার করতে হবে

// example duck typing method
var hasMethods = function(obj /*, method list as strings */){
    var i = 1, methodName;
    while((methodName = arguments[i++])){
        if(typeof obj[methodName] != 'function') {
            return false;
        }
    }
    return true;
}

// in your code
if(hasMethods(obj, 'quak', 'flapWings','waggle')) {
    //  IT'S A DUCK, do your duck thang
}

"প্রো জাভাস্ক্রিপ্ট ডিজাইনের নকশাগুলি" বইয়ে বর্ণিত পদ্ধতিটি সম্ভবত আমি এখানে পড়েছি এবং যা চেষ্টা করেছি তার থেকে একগুচ্ছ জিনিসগুলির সেরা পন্থা। আপনি এর উপরে উত্তরাধিকার ব্যবহার করতে পারেন, এটি OOP ধারণাগুলি অনুসরণ করা আরও উন্নত করে। কেউ কেউ দাবি করতে পারে যে জেএসে আপনার ওওপি ধারণা দরকার নেই, তবে আমি আলাদা হতে অনুরোধ করছি।
অ্যানিমেগোফাইন 21

21

জাভাস্ক্রিপ্ট (ECMAScript সংস্করণ 3) এর ভবিষ্যতের ব্যবহারের জন্যimplements সংরক্ষিত শব্দ রয়েছে । আমি মনে করি এটি ঠিক এই উদ্দেশ্যেই করা হয়েছিল, তবে দরজার বাইরে স্পেসিফিকেশনটি পাওয়ার জন্য তাড়াহুড়ো করে তাদের সাথে কী করা উচিত তা সংজ্ঞায়নের জন্য তাদের কাছে সময় ছিল না, সুতরাং বর্তমান সময়ে ব্রাউজারগুলি ছাড়াও কিছু করে না যদি আপনি এটি কোনও কিছুর জন্য ব্যবহার করার চেষ্টা করেন তবে এটি সেখানে বসুন এবং মাঝে মাঝে অভিযোগ করুন।

Object.implement(Interface)যুক্তি দিয়ে আপনার নিজস্ব পদ্ধতি তৈরি করা সম্ভব এবং সত্যই যথেষ্ট সহজ যে বাউলগুলি যখনই কোনও নির্দিষ্ট সংস্থার / ফাংশনগুলির একটি সেট কোনও নির্দিষ্ট বস্তুর মধ্যে প্রয়োগ না করে।

আমি অবজেক্ট-ওরিয়েন্টেশন সম্পর্কিত একটি নিবন্ধ লিখেছি যেখানে নীচে আমার নিজস্ব স্বরলিপি ব্যবহার করুন :

// Create a 'Dog' class that inherits from 'Animal'
// and implements the 'Mammal' interface
var Dog = Object.extend(Animal, {
    constructor: function(name) {
        Dog.superClass.call(this, name);
    },
    bark: function() {
        alert('woof');
    }
}).implement(Mammal);

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

Function.prototype.implement = function() {
    // Loop through each interface passed in and then check 
    // that its members are implemented in the context object (this).
    for(var i = 0; i < arguments.length; i++) {
       // .. Check member's logic ..
    }
    // Remember to return the class being tested
    return this;
}

4
এই বাক্য গঠনটি আমার মস্তিস্ককে সত্যই আঘাত করে তবে এখানে বাস্তবায়ন বেশ আকর্ষণীয়।
সাইফার

2
জাভাস্ক্রিপ্ট বিশেষভাবে ক্লোনার ওও ভাষার প্রয়োগগুলি থেকে আসা অবস্থায় (মস্তিষ্ককে আঘাত করা) তা করতে বাধ্য bound
স্টিভেন ডি সালাস

10
@ স্টিভেনডিসালস: এহ। আপনি যখন এটিকে শ্রেণিকেন্দ্রিক ভাষা হিসাবে বিবেচনা করার চেষ্টা করা বন্ধ করেন তখন জেএস প্রকৃতপক্ষে বেশ পরিষ্কার থাকে to ক্লাস, ইন্টারফেস ইত্যাদির অনুকরণের জন্য প্রয়োজনীয় সমস্ত বোকা ... এটিই আপনার মস্তিষ্ককে সত্যই আঘাত করবে। এগুলির নমুনা? সাধারণ জিনিসগুলি, সত্যিই, একবার আপনি তাদের সাথে লড়াই বন্ধ করে দেন।
সিএইচও

"// এর মধ্যে কী আছে .. সদস্যের যুক্তি পরীক্ষা করুন।" ? দেখতে কেমন লাগে?
PositiveGuy

হাই @ আমরা সদস্যদের যুক্তি যাচাই করা মানে কাঙ্ক্ষিত বৈশিষ্ট্যগুলি লুপ করা এবং যদি কোনও অনুপস্থিত থাকে তবে একটি ত্রুটি নিক্ষেপ করা var interf = arguments[i]; for (prop in interf) { if (this.prototype[prop] === undefined) { throw 'Member [' + prop + '] missing from class definition.'; }}। আরও বিস্তৃত উদাহরণের জন্য নিবন্ধের নীচের অংশটি দেখুন।
স্টিভেন ডি সালাস

12

জাভাস্ক্রিপ্ট ইন্টারফেস:

যদিও জাভাস্ক্রিপ্টে টাইপ না থাকলেও interfaceপ্রায়শই এটি প্রয়োজন হয়। জাভাস্ক্রিপ্টের গতিশীল প্রকৃতি এবং প্রোটোটাইপিকাল-হেরিরিটেন্সের ব্যবহার সম্পর্কিত কারণগুলির জন্য, ক্লাসে অবিচ্ছিন্ন ইন্টারফেসগুলি নিশ্চিত করা কঠিন - তবে এটি করা সম্ভব; এবং ঘন ঘন অনুকরণ।

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

এখানে ইন্টারফেস / অ্যাবস্ট্রাক্ট ক্লাসগুলির একটি পদ্ধতি যা খুব জটিল নয়, তা স্পষ্টতই বোঝা যায়, অ্যাবস্ট্রাকশনের অভ্যন্তরীণ প্রয়োগকে ন্যূনতম স্থানে রাখে এবং গতিশীল বা কাস্টম পদ্ধতিগুলির জন্য যথেষ্ট জায়গা ছেড়ে দেয়:

function resolvePrecept(interfaceName) {
    var interfaceName = interfaceName;
    return function curry(value) {
        /*      throw new Error(interfaceName + ' requires an implementation for ...');     */
        console.warn('%s requires an implementation for ...', interfaceName);
        return value;
    };
}

var iAbstractClass = function AbstractClass() {
    var defaultTo = resolvePrecept('iAbstractClass');

    this.datum1 = this.datum1 || defaultTo(new Number());
    this.datum2 = this.datum2 || defaultTo(new String());

    this.method1 = this.method1 || defaultTo(new Function('return new Boolean();'));
    this.method2 = this.method2 || defaultTo(new Function('return new Object();'));

};

var ConcreteImplementation = function ConcreteImplementation() {

    this.datum1 = 1;
    this.datum2 = 'str';

    this.method1 = function method1() {
        return true;
    };
    this.method2 = function method2() {
        return {};
    };

    //Applies Interface (Implement iAbstractClass Interface)
    iAbstractClass.apply(this);  // .call / .apply after precept definitions
};

অংশগ্রহণকারীরা

প্রিসেপ্ট রেজোলভার

resolvePreceptফাংশন আপনার ভেতরে ব্যবহার করার জন্য একটি ইউটিলিটি & সাহায্যকারী ফাংশন সারাংশ ক্লাস । এর কাজটি হ'ল এনক্যাপসুলেটেড প্রিসিপ্টগুলি (ডেটা এবং আচরণ) কাস্টমাইজড প্রয়োগকরণ-পরিচালনা করার অনুমতি দেওয়া । এটি ত্রুটি ছুঁড়ে দিতে পারে বা সতর্ক করতে পারে - এবং - প্রয়োগকারী শ্রেণিতে একটি ডিফল্ট মান নির্ধারণ করে।

iAbstractClass

iAbstractClassইন্টারফেস ব্যবহার করা সংজ্ঞায়িত করে। এর পদ্ধতির প্রয়োগকারী শ্রেণীর সাথে স্বতন্ত্র চুক্তি রয়েছে। এই ইন্টারফেসটি প্রতিটি প্রসেপ্টকে একই নির্ভুল প্রসেপ্ট নেমস্পেসে অর্পণ করে - বা - প্রিসেপ্ট রিসলভার ফাংশনটি যাই হোক না কেন দেয়। যাইহোক, স্পষ্ট চুক্তি একটি প্রসঙ্গে সমাধান করে - প্রবর্তকের বিধান।

প্রয়োগ

প্রয়োগ কেবল (একটি ইন্টারফেস সঙ্গে 'একমত' iAbstractClass এই ক্ষেত্রে) এবং ব্যবহার দ্বারা তা প্রযোজ্য রচয়িতা-ছিনতাই : iAbstractClass.apply(this)। উপরের ডেটা এবং আচরণটি সংজ্ঞায়িত করে এবং তারপরে ইন্টারফেসের নির্মাণকারীকে হাইজ্যাক করে - ইন্টারফেস কনস্ট্রাক্টরের কাছে প্রয়োগকারীের প্রসঙ্গটি প্রেরণ করে - আমরা নিশ্চিত করতে পারি যে ইমপ্লিমেন্টরের ওভাররাইডগুলি যুক্ত করা হবে, এবং সেই ইন্টারফেস সতর্কতা এবং ডিফল্ট মানগুলি প্রকাশ করবে।

এটি একটি খুব অ-জটিল সমস্যা যা আমার দলকে পরিবেশন করেছে এবং সময় এবং বিভিন্ন প্রকল্পের জন্য আমি খুব ভাল। তবে এর কিছুটা সতর্কতা ও ঘাটতি রয়েছে।

অপূর্ণতা

যদিও এটি আপনার সফ্টওয়্যার জুড়ে একটি উল্লেখযোগ্য মাত্রায় ধারাবাহিকতা প্রয়োগ করতে সহায়তা করে, এটি সত্য ইন্টারফেস প্রয়োগ করে না - তবে সেগুলি অনুকরণ করে। সংজ্ঞা, অক্ষমতা, এবং সতর্কবার্তা বা ত্রুটি যদিও হয় explicated, ব্যবহারের ব্যাখ্যা করা হয় জারি & জাহির ডেভেলপার দ্বারা (জাভাস্ক্রিপ্ট উন্নয়নের অনেক সঙ্গে হিসাবে)।

এটি "জাভাস্ক্রিপ্টের ইন্টারফেসগুলিতে" আপাতদৃষ্টিতে সেরা পন্থা , তবে আমি নীচের সমাধানটি দেখতে পছন্দ করব:

  • রিটার্ন প্রকারের জোর
  • স্বাক্ষরের জোর
  • deleteক্রিয়াগুলি থেকে অবজেক্টগুলিকে স্থির করুন
  • জাভাস্ক্রিপ্ট সম্প্রদায়ের নির্দিষ্টকরণে প্রচলিত বা প্রয়োজনীয় অন্য কোনও কিছুর যুক্তি

এটি বলেছিল, আমি আশা করি এটি আমার দল এবং আমি যেমন আছে ততটাই আপনাকে সহায়তা করবে hope


7

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


1
প্রকৃতপক্ষে, আপনার জাভাতে ইন্টারফেসের দরকার নেই, অবজেক্টগুলির একটি নির্দিষ্ট এপিআই রয়েছে তা নিশ্চিত হওয়া নিরাপদ যাতে আপনি অন্যান্য প্রয়োগের জন্য এগুলি পরিবর্তন করতে পারেন।
বিজিরিসসেন

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

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

2
@ এন্টোনিও: প্রেরণটি দেখতে যতটা গতিশীল তা নয়। পলিমॉर्फিজমকে ধন্যবাদ, আসল পদ্ধতিটি প্রায়শই রানটাইম পর্যন্ত জানা যায় না, তবে বাইটোকোডটি "আপনার মেথোডকে আহবান করুন" বলে না; এটিতে বলা হয়েছে "সুপারকার্লাস.ইউরমঠোদকে অনুরোধ করুন"। JVM কোন ক্লাসটি কীভাবে সন্ধান করবে তা জেনেও কোনও পদ্ধতিতে আবেদন করতে পারে yourMethodনা Superclassl সংযোগ করার সময়, এটি এর ভিটিবেলে # 5 এ প্রবেশ করতে পারে এবং প্রতিটি সাবক্লাসের নিজস্ব নিজস্ব রয়েছে yourMethod, কেবল যে সাবক্লাসের প্রবেশিকা # 5 নির্দেশ করে উপযুক্ত বাস্তবায়নে
সিএইচও

1
@entonio: ইন্টারফেসের জন্য, বিধি না একটু পরিবর্তন করুন। (ভাষাভিত্তিক নয়, তবে উত্পন্ন বাইকোড এবং জেভিএমের লুকিংয়ের প্রক্রিয়া আলাদা)) নাম Implementationপ্রয়োগ করা একটি শ্রেণি SomeInterfaceকেবল এটি বলে না যে এটি পুরো ইন্টারফেসটি প্রয়োগ করে। এটিতে এমন তথ্য রয়েছে যা "আমি প্রয়োগ করি SomeInterface.yourMethod" বলে এবং পদ্ধতির সংজ্ঞাটিতে নির্দেশ করে Implementation.yourMethod। যখন জেভিএম কল করে SomeInterface.yourMethod, তখন সেই ইন্টারফেসের পদ্ধতির বাস্তবায়ন সম্পর্কে তথ্যের জন্য এটি শ্রেণিতে দেখায় এবং এটির কল করার দরকার পড়ে Implementation.yourMethod
সিএইচও

6

আশা করি, যে কেউ এখনও উত্তর খুঁজছেন সে এটি সহায়ক বলে মনে করে।

আপনি একটি প্রক্সি ব্যবহার করে দেখতে পারেন (এটি ECMAScript 2015 সালের পরে স্ট্যান্ডার্ড): https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/Global_Objects/Proxy

latLngLiteral = new Proxy({},{
    set: function(obj, prop, val) {
        //only these two properties can be set
        if(['lng','lat'].indexOf(prop) == -1) {
            throw new ReferenceError('Key must be "lat" or "lng"!');
        }

        //the dec format only accepts numbers
        if(typeof val !== 'number') {
            throw new TypeError('Value must be numeric');
        }

        //latitude is in range between 0 and 90
        if(prop == 'lat'  && !(0 < val && val < 90)) {
            throw new RangeError('Position is out of range!');
        }
        //longitude is in range between 0 and 180
        else if(prop == 'lng' && !(0 < val && val < 180)) {
            throw new RangeError('Position is out of range!');
        }

        obj[prop] = val;

        return true;
    }
});

তারপরে আপনি সহজেই বলতে পারেন:

myMap = {}
myMap.position = latLngLiteral;

5

আপনি যখন ট্রান্সকোম্পিলার ব্যবহার করতে চান, তখন আপনি টাইপস্ক্রিপ্ট একবার চেষ্টা করে দেখতে পারেন। এটি খসড়া ইসিএমএ বৈশিষ্ট্যগুলিকে সমর্থন করে (প্রস্তাবনায় ইন্টারফেসগুলিকে " প্রোটোকল " বলা হয় ) যা কফিস্ক্রিপ্ট বা বাবেলের মতো ভাষার মতো করে do

টাইপসক্রিপ্টটিতে আপনার ইন্টারফেসটি দেখতে দেখতে দেখতে পারে:

interface IMyInterface {
    id: number; // TypeScript types are lowercase
    name: string;
    callback: (key: string; value: any; array: string[]) => void;
    type: "test" | "notATest"; // so called "union type"
}

আপনি যা করতে পারবেন না:


3

জাভাস্ক্রিপ্টে কোনও নেটিভ ইন্টারফেস নেই, ইন্টারফেস অনুকরণ করার বিভিন্ন উপায় রয়েছে। আমি এটি একটি প্যাকেজ লিখেছি

আপনি এখানে প্রতিস্থাপন দেখতে পারেন


2

জাভাস্ক্রিপ্টের ইন্টারফেস নেই। তবে এটি হাঁসের মতো টাইপ করা যেতে পারে, একটি উদাহরণ এখানে পাওয়া যাবে:

http://reinsbrain.blogspot.com/2008/10/interface-in-javascript.html


আমি সেই লিঙ্কের নিবন্ধটি ধরণের সম্পর্কে দৃ make়তা জানাতে প্যাটার্নটি পছন্দ করি। কোনও কিছু যখন পদ্ধতিটি অনুমান করে তার বাস্তবায়ন না করে এমন একটি ত্রুটি ছুঁড়ে ফেলা হচ্ছে যা আমি প্রত্যাশা করতাম এবং আমি পছন্দ করি যে আমি কীভাবে এই প্রয়োজনীয় পদ্ধতিগুলি একসাথে (ইন্টারফেসের মতো) একসাথে গ্রুপ করতে পারি যদি আমি এটি এইভাবে করি তবে।
এরিক ডাবé

1
আমি ট্রান্সপ্লাইংকে ঘৃণা করি (এবং ডিবাগিংয়ের উত্স মানচিত্র) তবে টাইপস্ক্রিপ্ট ES6 এর এত কাছে যে আমি নাক চেপে ধরে টাইপস্ক্রিপ্টে ডুব দিতে চাইছি। ES6 / টাইপস্ক্রিপ্ট আকর্ষণীয় কারণ এটি আপনাকে ইন্টারফেস (আচরণ) সংজ্ঞায়িত করার সময় পদ্ধতিগুলির পাশাপাশি বৈশিষ্ট্যগুলিকে অন্তর্ভুক্ত করতে দেয়।
রেনসব্রাইন

1

আমি জানি এটি একটি পুরানো, তবে আমি সম্প্রতি আমার নিজের ইন্টারফেসের বিরুদ্ধে আইটেমগুলি যাচাই করার জন্য একটি সহজ এপিআই লাগানোর জন্য নিজেকে আরও বেশি বেশি প্রয়োজন বলে মনে করেছি। সুতরাং আমি এটি লিখেছি: https://github.com / টমহিক্স / thodতিহ্যগত

এটি এনপিএম এর মাধ্যমেও পাওয়া যায়: npm install methodical

এটি মূলত উপরে প্রস্তাবিত সমস্ত কিছু করে, কিছুটা আরও কঠোর হওয়ার জন্য কিছু বিকল্প সহ এবং সমস্ত কিছু if (typeof x.method === 'function')বয়লারপ্লেট না করেই করা হয় ।

আশা করি কেউ এটি কাজে লাগবে।


টম, আমি সবেমাত্র একটি কৌণিক জেএস টিডিডি ভিডিও দেখেছি এবং যখন সে একটি কাঠামো ইনস্টল করে, নির্ভর প্যাকেজগুলির মধ্যে একটি হ'ল আপনার পদ্ধতিগত প্যাকেজ! ভাল করেছ!
কোডি

হাহা চমৎকার। জাভাস্ক্রিপ্টে ইন্টারফেসের কোনও উপায় নেই বলে লোকেরা আমাকে বোঝানোর পরে আমি মূলত এটিকে পরিত্যাগ করেছি। সম্প্রতি আমার কাছে একটি লাইব্রেরি সম্পর্কে ধারণা ছিল যা মূলত কোনও অবজেক্টের প্রক্স করে এটি নিশ্চিত করে যে এটিতে কেবলমাত্র কয়েকটি পদ্ধতি ব্যবহার করা হয় যা মূলত ইন্টারফেসটি কী। আমি এখনও মনে করি জাভাস্ক্রিপ্টে ইন্টারফেসের একটি জায়গা আছে! আপনি কি সেই ভিডিওটিকে লিঙ্ক করতে পারেন? আমি একবার দেখতে চাই
টম

আপনি বাজি, টম। আমি শীঘ্রই এটি চেষ্টা করার চেষ্টা করব। প্রক্সি হিসাবে ইন্টারফেসের সম্পর্কে উপাখ্যানকেও ধন্যবাদ। চিয়ার্স!
কোডি

1

এটি একটি পুরানো প্রশ্ন, তবুও এই বিষয়টি আমাকে কখনই থামিয়ে দেয় না।

এখানে এবং ওয়েব জুড়ে অনেকগুলি উত্তর ইন্টারফেসকে "প্রয়োগ" করার দিকে দৃষ্টি নিবদ্ধ করে, আমি একটি বিকল্প দর্শন প্রস্তাব করতে চাই:

আমি ইন্টারফেসের অভাব সবচেয়ে বেশি অনুভব করি যখন আমি একাধিক ক্লাস ব্যবহার করি যা একইভাবে আচরণ করে (যেমন একটি ইন্টারফেস প্রয়োগ করে )।

উদাহরণস্বরূপ, আমার কাছে একটি ইমেল জেনারেটর রয়েছে যা ইমেল সেকশন ফ্যাক্টরিগুলি পাওয়ার প্রত্যাশা করে , যা বিভাগগুলির সামগ্রী এবং এইচটিএমএল জেনারেট করতে "জানেন"। সুতরাং, তাদের সকলের কিছু না কিছু পদ্ধতি getContent(id)এবং getHtml(content)পদ্ধতি থাকা দরকার।

ইন্টারফেসের নিকটতম প্যাটার্ন (যদিও এটি এখনও কার্যকর নয়) আমি এমন একটি শ্রেণি ব্যবহার করছি যা 2 টি আর্গুমেন্ট পাবে যা 2 ইন্টারফেসের পদ্ধতিগুলি সংজ্ঞায়িত করবে।

এই প্যাটার্নটির সাথে প্রধান চ্যালেঞ্জটি হ'ল staticএর বৈশিষ্ট্যগুলি অ্যাক্সেস করার জন্য পদ্ধতিগুলি হয় হয় বা দৃষ্টান্ত হিসাবে নিজেকে যুক্তি হিসাবে পেতে হয়। তবে এমন কেস রয়েছে যাতে আমি এই বাণিজ্যটি ঝামেলার পক্ষে মূল্যবান বলে মনে করি।

class Filterable {
  constructor(data, { filter, toString }) {
    this.data = data;
    this.filter = filter;
    this.toString = toString;
    // You can also enforce here an Iterable interface, for example,
    // which feels much more natural than having an external check
  }
}

const evenNumbersList = new Filterable(
  [1, 2, 3, 4, 5, 6], {
    filter: (lst) => {
      const evenElements = lst.data.filter(x => x % 2 === 0);
      lst.data = evenElements;
    },
    toString: lst => `< ${lst.data.toString()} >`,
  }
);

console.log('The whole list:    ', evenNumbersList.toString(evenNumbersList));
evenNumbersList.filter(evenNumbersList);
console.log('The filtered list: ', evenNumbersList.toString(evenNumbersList));


0

বিমূর্ত ইন্টারফেস এর মত

const MyInterface = {
  serialize: () => {throw "must implement serialize for MyInterface types"},
  print: () => console.log(this.serialize())
}

একটি উদাহরণ তৈরি করুন:

function MyType() {
  this.serialize = () => "serialized "
}
MyType.prototype = MyInterface

এবং এটি ব্যবহার করুন

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