সি ++ এ "ইন্টারফেস" শব্দটি


11

জাভা classএবং এর মধ্যে একটি স্পষ্ট পার্থক্য করে interface। (আমি বিশ্বাস করি সি # তেও করে, তবে এর সাথে আমার কোনও অভিজ্ঞতা নেই)। সি ++ লেখার সময় কোনও শ্রেণি এবং ইন্টারফেসের মধ্যে কোনও ভাষা প্রয়োগ করা যায় না।

ফলস্বরূপ আমি জাভাতে একাধিক উত্তরাধিকারের অভাবের জন্য ইন্টারফেসটিকে সর্বদা কার্যকর হিসাবে দেখেছি। এ জাতীয় পার্থক্য করা C ++ এ স্বেচ্ছাসেবী এবং অর্থহীন বোধ করে।

আমি সর্বদা "সর্বাধিক সুস্পষ্ট উপায়ে জিনিস লিখুন" পদ্ধতির সাথে যাওয়ার প্রবণতা রেখেছি, সুতরাং সি ++ এ যদি জাভাতে একটি ইন্টারফেস বলা যেতে পারে যা পেয়েছি, যেমন:

class Foo {
public:
  virtual void doStuff() = 0;
  ~Foo() = 0;
};

এবং আমি তখন সিদ্ধান্ত নিয়েছিলাম যে বেশিরভাগ প্রয়োগকারীরা Fooসম্ভবত কিছু সাধারণ কার্যকারিতা ভাগ করে নিতে চেয়েছিলেন:

class Foo {
public:
  virtual void doStuff() = 0;
  ~Foo() {}
protected:
  // If it needs this to do its thing:
  int internalHelperThing(int);
  // Or if it doesn't need the this pointer:
  static int someOtherHelper(int);
};

যা এটি আর জাভা অর্থে ইন্টারফেস নয়।

পরিবর্তে সি ++ এর দুটি অন্তর্নিহিত উত্তরাধিকার সমস্যার সাথে সম্পর্কিত দুটি গুরুত্বপূর্ণ ধারণা রয়েছে:

  1. virtual inhertiance
  2. বেস হিসাবে ব্যবহার করার সময় কোনও সদস্য ভেরিয়েবলযুক্ত শ্রেণিগুলি অতিরিক্ত স্থান দখল করতে পারে না

    "বেস শ্রেণীর সাবোবজেক্টগুলির শূন্য আকার থাকতে পারে"

    উল্লেখ

তাদের মধ্যে আমি যেখানেই সম্ভব # 1 এড়াতে চেষ্টা করি - এমন দৃশ্যের মুখোমুখি হওয়া বিরল যেখানে সত্যই "পরিষ্কার" নকশা। # 2 তবে "ইন্টারফেস" শব্দটি এবং সি ++ ভাষার বৈশিষ্ট্যগুলি সম্পর্কে আমার বোঝার মধ্যে একটি সূক্ষ্ম তবে গুরুত্বপূর্ণ পার্থক্য। এর ফলস্বরূপ আমি বর্তমানে (প্রায়) কখনই জিনিসগুলিকে সি ++ তে "ইন্টারফেস" হিসাবে উল্লেখ করি না এবং বেস ক্লাস এবং তাদের আকারগুলির ক্ষেত্রে কথা বলি। আমি বলব যে সি ++ "ইন্টারফেস" এর প্রসঙ্গে একটি মিসনোমার।

এটি আমার নজরে এসেছে যদিও অনেকেই এইরকম পার্থক্য করেন না।

  1. সি ++ এর একটি "ইন্টারফেস" এর মধ্যে (উদাঃ protected) অ- virtualফাংশনগুলির অস্তিত্বের অনুমতি দিয়ে কি আমি কোনও কিছু হারাতে চাই ? (আমার অনুভূতি হ'ল বিপরীত - ভাগ করা কোডের জন্য আরও প্রাকৃতিক অবস্থান)
  2. "ইন্টারফেস" শব্দটি কি সি ++ এর অর্থবহ - এটি কি কেবল বিশুদ্ধ বোঝায় virtualবা কোনও সদস্যের ভেরিয়েবল সহ সি ++ ক্লাস বলা ভাল কি হবে?

সি # এর একই ইন্টারফেসের একাধিক উত্তরাধিকার, জাভা হিসাবে বাস্তবায়নের একক উত্তরাধিকার রয়েছে , তবে জেনেরিক এক্সটেনশন পদ্ধতি ব্যবহারের মাধ্যমে , internalHelperThingপ্রায় সব ক্ষেত্রেই সিমুলেটেড করা যায়।
সোজর্ড

নোট করুন যে ভার্চুয়াল সদস্যদের প্রকাশের জন্য এটি খারাপ অভ্যাস।
ক্লাইম

~Foo() {}বিমূর্ত শ্রেণিতে জনসাধারণ হ'ল (প্রায়) প্রতিটি পরিস্থিতিতে একটি ত্রুটি।
ওল্ফ

উত্তর:


11

সি ++-তে, "ইন্টারফেস" শব্দটির কেবল একটি বহুল স্বীকৃত সংজ্ঞা নেই - সুতরাং আপনি যখনই এটি ব্যবহার করতে যাচ্ছেন তখন আপনার ঠিক কী বোঝানো উচিত তা বলা উচিত - ডিফল্ট বাস্তবায়নের সাথে বা কোনও শিরোনামহীন একটি ভার্চুয়াল বেস শ্রেণি, পাবলিক সদস্যগণ একটি স্বেচ্ছাসেবী শ্রেণীর এবং তাই।

আপনার উদাহরণ সম্পর্কিত: জাভাতে (এবং সি # তেও অনুরূপ), আপনার কোড সম্ভবত উদ্বেগের বিচ্ছেদ বোঝায়:

interface IFoo {/*  ... */} // here is your interface

class FooBase implements IFoo 
{
     // make default implementations for interface methods
}

class Foo extends FooBase
{
}

সি ++ এ আপনি এটি করতে পারেন তবে আপনাকে বাধ্য করা হয় না। এবং যদি আপনি কোনও শ্রেণীর একটি ইন্টারফেস কল করতে পছন্দ করেন তবে এর কোনও সদস্যের ভেরিয়েবল নেই, তবে কিছু পদ্ধতির জন্য এটি ডিফল্ট বাস্তবায়ন রয়েছে, কেবল তাই করুন, তবে নিশ্চিত হয়ে নিন যে আপনি যার সাথে কথা বলছেন তারা আপনার অর্থ কী তা জানে।


3
"ইন্টারফেস" এর আর একটি সম্ভাব্য অর্থ, সি ++ প্রোগ্রামারকে, ফাইলটির publicঅংশগুলি .h
ডেভিড থর্নলি

আপনার কোড উদাহরণ কোন ভাষা? যদি এটি সি ++ হওয়ার চেষ্টা হয় তবে আমি কাঁদতে চলেছি ...
কিউস - মনিকা

@ কিউক্স: এটিকে সহজ রাখুন, আমার পোস্টিংটি আবার পড়ুন (এতে স্পষ্টভাবে কোডটি জাভাতে রয়েছে বলে উল্লেখ করা হয়েছে), এবং আপনি যদি> 2000 পয়েন্ট পেয়ে থাকেন তবে আমার পোস্টিংটি সমতুল্য সি ++ উদাহরণ কোড যুক্ত করতে, আমার উদাহরণটি আরও তৈরি করতে পারেন পরিষ্কার.
ডক ব্রাউন

যদি তা জাভা হয় তবে এটি এখনও ভুল, এবং না আমি এটি সম্পাদনা করতে পারি না; পরিবর্তন করার জন্য যথেষ্ট অক্ষর নেই। জাভা বাস্তবায়ন /
প্রসারণে কলোন

@ কিউস: যদি আপনি আরও সিনট্যাক্টিকাল বিষয়গুলি খুঁজে পান তবে আপনি তাদেরকে ক্রিসমাস হিসাবে উপস্থিত রাখতে পারেন :-)
ডক ব্রাউন

7

এটির মতো কিছুটা মনে হচ্ছে আপনি এটির অর্থটি বিভ্রান্ত করার ফাঁদে পড়েছেন যে কোনও ইন্টারফেসটি বাস্তবায়নের (ইন্টারফেস - ছোট হাতের অক্ষর 'i') এবং বিমূর্ততা উভয় হিসাবে ধারণাগতভাবে হয় (একটি ইন্টারফেস - বড় হাতের 'I') )।

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

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

সি ++ এর একটি "ইন্টারফেস" এর মধ্যে অ-ভার্চুয়াল ফাংশনগুলি (যেমন সুরক্ষিত) অস্তিত্বের অনুমতি দিয়ে আমি কি কিছু হারাতে চাই? (আমার অনুভূতি হ'ল বিপরীত - ভাগ করা কোডের জন্য আরও প্রাকৃতিক অবস্থান)

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

"ইন্টারফেস" শব্দটি কি সি ++ এর অর্থবহ - এটি কেবল খাঁটি ভার্চুয়ালকেই বোঝায় বা কোনও সদস্যের ভেরিয়েবলের সি ++ ক্লাসকে ইন্টারফেস হিসাবে কল করা কি ন্যায্য হবে?

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


1
ইন্টারফেস "থাকার" এবং "থাকা" এর মধ্যে পার্থক্যের জন্য +1।
ডক ব্রাউন

6

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

সুরক্ষিত পদ্ধতির সাথে আপনার ইন্টারফেস হ'ল "উত্তরাধিকারের তুলনায় রচনাটিকে প্রাধান্য দেওয়ার" প্রয়োজন একটি পাঠ্যপুস্তকের ক্ষেত্রে। বিভাগে সুটার এবং আলেকজান্দ্রেস্কু থেকে তাদের দুর্দান্ত সি ++ কোডিং স্ট্যান্ডার্ডগুলি থেকে সেই নামে উদ্ধৃতি দিতে :

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

আপনার ইন্টারফেসে আপনার সহায়ক ফাংশনগুলি অন্তর্ভুক্ত করে, আপনি এখন কিছুটা টাইপিং বাঁচাতে পারেন তবে আপনি এমন সংযোগের পরিচয় দিচ্ছেন যা আপনাকে রাস্তায় আঘাত করবে। আপনার সহায়ক ফাংশনগুলি পৃথক করে এটিতে পাস করার জন্য এটি প্রায় সর্বদা ভাল দীর্ঘমেয়াদী Foo*

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


2

সি ++ এর একটি "ইন্টারফেস" এর মধ্যে অ-ভার্চুয়াল ফাংশনগুলি (যেমন সুরক্ষিত) অস্তিত্বের অনুমতি দিয়ে আমি কি কিছু হারাতে চাই? (আমার অনুভূতি হ'ল বিপরীত - ভাগ করা কোডের জন্য আরও প্রাকৃতিক অবস্থান)

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

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

"ইন্টারফেস" শব্দটি কি সি ++ এর অর্থবহ - এটি কেবল খাঁটি ভার্চুয়ালকেই বোঝায় বা কোনও সদস্যের ভেরিয়েবলের সি ++ ক্লাসকে ইন্টারফেস হিসাবে কল করা কি ন্যায্য হবে?

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


2
খাঁটি ভার্চুয়াল ঘোষণা এবং একটি ঘোষণা প্লাস বাস্তবায়নের মধ্যে পার্থক্য কী? উভয় ক্ষেত্রেই, একটি বাস্তবায়ন থাকতে হবে, এবং bazসর্বদা যেমন return false;বা যা কিছু বাস্তবায়ন থাকতে পারে । যদি পদ্ধতিটি সকল উপশ্রেণীর জন্য প্রয়োগ না হয় তবে এটি কোনও আকারে বেস বিমূর্ত শ্রেণিতে অন্তর্ভুক্ত নয়।
ডেভিড থর্নলি

1
আমার মনে হয় আপনার শেষ বাক্যটি আমরা একই পৃষ্ঠায় রয়েছি: বিমূর্ত ক্লাসগুলিতে আপনার সুরক্ষিত পদ্ধতিগুলি থাকতে পারে না এমন কোনও কারণ নেই তবে এগুলি উত্তরাধিকারের গাছের মধ্যে একেবারে প্রয়োজনীয়ের চেয়ে বেশি হওয়া উচিত নয়। আমি কেবল মনে করি যদি কোনও শ্রেণি যদি একটি বাস্তবায়ন ডামি করতে হয় তবে গাছের মধ্যে এটি সঠিক জায়গায় নয়।
blrfl
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.