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


30

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

interface IFooWorker { void Work(); }

abstract class BaseWorker {
    ... base class behaviors ...
    public abstract void Work() { }
    protected string CleanData(string data) { ... }
}

class DbWorker : BaseWorker, IFooWorker {
    public void Work() {
        Repository.AddCleanData(base.CleanData(UI.GetDirtyData()));
    }
}

ডিবি ওয়ার্কার হ'ল আইএফওয়ুওয়ার্কার ইন্টারফেস যা পায়, কারণ এটি ইন্টারফেসের একটি তাত্ক্ষণিক বাস্তবায়ন। এটি চুক্তিটি সম্পূর্ণরূপে পূরণ করে। আমার সহকর্মী প্রায় অনুরূপ পছন্দ:

interface IFooWorker { void Work(); }

abstract class BaseWorker : IFooWorker {
    ... base class behaviors ...
    public abstract void Work() { }
    protected string CleanData(string data) { ... }
}

class DbWorker : BaseWorker {
    public void Work() {
        Repository.AddCleanData(base.CleanData(UI.GetDirtyData()));
    }
}

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

বনাম আমার তার পদ্ধতির কল্যাণকতাগুলি কী কী এবং কেন একজনকে অন্যের উপর ব্যবহার করা উচিত?


আপনার পরামর্শটি হীরকের উত্তরাধিকারের সাথে খুব সাদৃশ্যপূর্ণ , যা আরও বেশি বিভ্রান্তির কারণ হতে পারে।
Spoike

@ এসপাইক: কীভাবে দেখব?
নিং

আমি মন্তব্যে যে লিঙ্কটি দিয়েছি তা নিইংয়ের একটি সাধারণ বর্গ চিত্র এবং এটি কী তা সম্পর্কে একটি সরল ওয়ান-লাইনারের ব্যাখ্যা রয়েছে। এটিকে "হীরা" সমস্যা বলা হয় কারণ উত্তরাধিকার কাঠামোটি মূলত হীরা আকারের (যেমন ♦ ️) এর মতো আঁকা হয়।
স্পোককে

@ এসপাইক: কেন এই প্রশ্ন হীরা উত্তরের কারণ হবে?
নিং

1
@ নিইং: বেস ওয়ার্কার এবং আইফু ওয়ার্কারকে একই পদ্ধতির সাথে Workউত্তরাধিকারী হীরক উত্তরাধিকারের সমস্যা (সেই ক্ষেত্রে তারা উভয়ই Workপদ্ধতিটির সাথে চুক্তি সম্পাদন করে )। জাভাতে আপনাকে ইন্টারফেসের পদ্ধতিগুলি প্রয়োগ করতে হবে যাতে Workপ্রোগ্রামটি কোন পদ্ধতিটি ব্যবহার করা উচিত তা এইভাবে এড়ানো যায়। সি ++ এর মতো ভাষাগুলি তবে আপনার জন্য এটি ছিন্ন করে না।
স্পোককে

উত্তর:


24

আমি বিশ্বাস করি যে কোনও শ্রেণীর ইন্টারফেস বাস্তবায়ন করা উচিত নয় যদি না ইন্টারফেসের প্রয়োগের প্রয়োজন হয় যখন শ্রেণিটি ব্যবহার করা যায় না।

BaseWorkerযে প্রয়োজনীয়তা পূরণ করে। কেবলমাত্র আপনি কোনও BaseWorkerবস্তুকে সরাসরি ইনস্ট্যান্ট করতে না পারার অর্থ এই নয় যে আপনার কাছে এমন একটি BaseWorker পয়েন্টার নেই যা চুক্তিটি পূর্ণ করে। প্রকৃতপক্ষে, এটি বিমূর্ত শ্রেণির পুরো পয়েন্ট।

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

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


1
এটি চিহ্নিত করার জন্য +1 কেবলমাত্র BaseWorkerসরাসরি অস্থায়ী নয়, এর অর্থ এই নয় যে প্রদত্ত BaseWorker myWorkerকার্যকর হয় না IFooWorker
অব্নার শাহর-কাশতান

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

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

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

46

আমি আপনার সহকর্মীর সাথে একমত হতে হবে।

আপনি যে দুটি উদাহরণই দিয়েছেন, বেস ওয়ার্কার অ্যাবস্ট্রাক্ট পদ্ধতি ওয়ার্ক () এর সংজ্ঞা দেয়, যার অর্থ সমস্ত উপক্লাস IFooWorker এর চুক্তি পূরণে সক্ষম। এই ক্ষেত্রে, আমি মনে করি বেস ওয়ার্কারের ইন্টারফেসটি বাস্তবায়ন করা উচিত, এবং বাস্তবায়নটি তার সাবক্লাস দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত হবে। এটি আপনাকে স্পষ্টভাবে ইঙ্গিত করা থেকে বাঁচাবে যে প্রতিটি সাবক্লাস প্রকৃতপক্ষে একটি আইএফওয়ু ওয়ার্কার (DRY নীতি)।

আপনি যদি ওয়ার্ক ওয়ার্কারের পদ্ধতি হিসাবে কাজের () সংজ্ঞা দিচ্ছেন না, বা যদি আইফোওয়কারকারের অন্যান্য পদ্ধতি রয়েছে যে বেস ওয়ার্কারের সাবক্লাসগুলি চায় না বা প্রয়োজন হয় না, তবে (স্পষ্টতই) আপনাকে নির্দেশ করতে হবে কোন সাবক্লাসগুলি আসলে আইএফওয়ুকারকার বাস্তবায়ন করে?


11
+1 একই জিনিস পোস্ট করতে হবে। দুঃখিত ইন্সটা, তবে আমি মনে করি আপনার সহকর্মীও ঠিক এই ক্ষেত্রে ঠিক আছে, যদি কোনও চুক্তি সম্পাদনের গ্যারান্টি দেয়, তবে সেই চুক্তির উত্তরাধিকারী হওয়া উচিত, গ্যারান্টিটি কোনও ইন্টারফেস, একটি বিমূর্ত শ্রেণি বা একটি কংক্রিট শ্রেণীর দ্বারা পূর্ণ হয় কিনা। সোজা কথায়: গ্যারান্টারের সেই চুক্তির উত্তরাধিকারী হওয়া উচিত।
জিমি হোফা

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

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

2
তারপর বেস বর্গ না বলা উচিত MyDaoFooবা SqlFooবা HibernateFooবা যাই হোক না কেন, ইঙ্গিত আছে যেন শুধুমাত্র একটি বাস্তবায়নের ক্লাস সম্ভব গাছ এর IFoo? এটা আমার কাছে যদি একটি বেস বর্গ একটি নির্দিষ্ট লাইব্রেরি বা প্ল্যাটফর্মে মিলিত হয় এবং সেখানে নামে এই কোনো উল্লেখ আছে ... এমনকি একটি গন্ধ আরো
Aaronaught

@ অ্যারোনট - হ্যাঁ আমি পুরোপুরি একমত.
ম্যাথু ফ্লিন

11

আমি সাধারণত আপনার সহকর্মীর সাথে একমত

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

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

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


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

কম বা কম, হ্যাঁ বড় সুবিধাটি হ'ল আপনি বেস ওয়ার্কারের উল্লেখগুলির সংখ্যা হ্রাস করবেন যা পরিবর্তে BetterBaseWorkers হতে হবে; আপনার বেশিরভাগ কোড IFooWorker ব্যবহারের পরিবর্তে সরাসরি কংক্রিট ক্লাসের উল্লেখ করবে না, সুতরাং যখন আপনি সেই IFooWorker নির্ভরতা (শ্রেণীর বৈশিষ্ট্য, নির্মাতা বা পদ্ধতিগুলির পরামিতি) নির্ধারিত জিনিসটি পরিবর্তন করেন তখন IFooWorker ব্যবহার করে কোডটি কোনও পার্থক্য দেখতে পাবেন না ব্যবহারে।
কিথস

6

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

জাভা সংগ্রহের ফ্রেমওয়ার্ক ক্লাস নিন:

abstract class AbstractList
class LinkedList extends AbstractList implements Queue

সত্য যে সারি চুক্তি দ্বারা বাস্তবায়িত হয় LinkedList মধ্যে উদ্বেগ ধাক্কা করা হয়নি AbstractList

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


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

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

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

এই অন্তর্দৃষ্টি জন্য আপনাকে ধন্যবাদ; আমি সম্মত নই যে ও.পি.-র কেসটি সেই বিভাগের মধ্যে পড়েছে, তবে আমি অনুভব করেছি যে একটি গভীর নিয়মের সন্ধানে আরও একটি বড় আলোচনা হয়েছে এবং আমি যে প্রবণতা সম্পর্কে পড়েছি সে সম্পর্কে আমার পর্যবেক্ষণগুলি ভাগ করতে চেয়েছিলাম (এবং এমনকি আমি নিজেও ছিলাম) অল্প সময়ের জন্য) উত্তরাধিকারের অতিরিক্ত ব্যবহার করার কারণ সম্ভবত এটি ওওপির সরঞ্জামবাক্সের অন্যতম একটি সরঞ্জাম।
মিহাই ড্যানিলা 13

ডাং, ছয় বছর কেটে গেছে। :)
মিহাই ড্যানিলা 13

2

আমি প্রশ্নটি জিজ্ঞাসা করব, আপনি যখন পরিবর্তিত হন IFooWorker, যেমন একটি নতুন পদ্ধতি যুক্ত করার পরে কী ঘটে ?

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

সেই কারণে, আমি বেস ক্লাসটি ইন্টারফেসটি বাস্তবায়িত করব, যেহেতু আমি উদ্ভূত ক্লাসগুলিকে স্পর্শ না করে বেস ক্লাসে নতুন পদ্ধতির সমস্ত কার্যকারিতা বাস্তবায়ন করতে সক্ষম হতে পারি ।


1

প্রথমে একটি বিমূর্ত বেস বর্গ কি এবং একটি ইন্টারফেস কি তা ভেবে দেখুন। আপনি কখন এক বা অন্যটি ব্যবহার করবেন এবং কখন ব্যবহার করবেন না তা বিবেচনা করুন।

লোকেরা উভয়কেই খুব একই ধারণা বলে মনে করা সাধারণ, বাস্তবে এটি একটি সাধারণ সাক্ষাত্কারের প্রশ্ন (উভয়ের মধ্যে পার্থক্য হল ??)

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

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

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

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


1

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

প্রথম:

একটি ইন্টারফেসের দুটি সাধারণ ব্যাখ্যা রয়েছে:

  1. একটি ইন্টারফেস হ'ল যে পদ্ধতি এবং বৈশিষ্ট্যগুলির কোনও তালিকা যা কোনও শ্রেণি প্রয়োগ করতে পারে এবং একটি ইন্টারফেস প্রয়োগ করে একটি শ্রেণি সেই পদ্ধতিগুলি (এবং তাদের স্বাক্ষরগুলি) গ্যারান্টি দেয় এবং সেই বৈশিষ্ট্যগুলি (এবং তাদের প্রকারগুলি) যখন সেই শ্রেণীর সাথে "ইন্টারফেসিং" থাকে তখন এই শ্রেণীর একটি বিষয়। একটি ইন্টারফেস একটি চুক্তি।

  2. ইন্টারফেসগুলি বিমূর্ত শ্রেণি যা কিছু করতে বা করতে পারে না। এগুলি কার্যকর কারণ আপনি পিতা-মাতার ক্লাসের বিপরীতে আপনি একাধিক বাস্তবায়ন করতে পারেন। যেমন, আমি ক্লাস কলাব্রেডের বস্তু হতে পারি এবং বেসব্রেড থেকে উত্তরাধিকারী হতে পারি, তবে এর অর্থ এই নয় যে আমি আইভিথনটস এবং আইটিস্টেসওয়াইমি ইন্টারফেস উভয়ই প্রয়োগ করতে পারি না। এমনকি আমি আইডোসডিশিশ ইন্টারফেসটি বাস্তবায়ন করতে পারি, কারণ আমি কেবল রুটিই নই, ইয়াকেন?

বিমূর্ত শ্রেণির দুটি সাধারণ ব্যাখ্যা রয়েছে:

  1. একটি বিমূর্ত শ্রেণি হ'ল, জ্ঞান, জিনিসটি কী করতে পারে তা নয়। এটি মত, সারাংশ, আসলেই আসল জিনিস নয়। থাকুন, এটি সাহায্য করবে। একটি নৌকা একটি বিমূর্ত শ্রেণি, কিন্তু একটি সেক্সি প্লেবয় ইয়ট বাসবোটের একটি উপ শ্রেণি হবে।

  2. আমি বিমূর্ত ক্লাসগুলিতে একটি বই পড়েছি এবং সম্ভবত আপনার সেই বইটি পড়া উচিত, কারণ আপনি সম্ভবত এটি পান না এবং আপনি যদি সেই বইটি না পড়ে থাকেন তবে এটি ভুল করে ফেলবেন।

যাইহোক, সিটার বইটি সর্বদা চিত্তাকর্ষক বলে মনে হয়, যদিও আমি এখনও বিভ্রান্ত হয়ে দূরে চলে যাই।

দ্বিতীয়ত:

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

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

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

তৃতীয়:

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

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


0

আপনার পরামর্শ অনুসারে, কেন DbWorkerপ্রয়োগ করা উচিত তার আরও একটি দিক রয়েছে IFooWorker

আপনার সহকর্মীর স্টাইলের ক্ষেত্রে, যদি কোনও কারণে পরে রিফ্যাক্টরিং ঘটে এবং DbWorkerএটি বিমূর্ত BaseWorkerশ্রেণিটি প্রসারিত না করে বলে মনে করা হয় , DbWorkerতবে IFooWorkerইন্টারফেসটি হারাবে। যদি তারা IFooWorkerইন্টারফেসটি আশা করে তবে এটির গ্রাহকদের উপর এটি প্রভাব ফেলতে পারে, অগত্যা নয় ।


-1

শুরু করতে, আমি ইন্টারফেস এবং বিমূর্ত ক্লাসগুলি আলাদাভাবে সংজ্ঞায়িত করতে চাই:

Interface: a contract that each class must fulfill if they are to implement that interface
Abstract class: a general class (i.e vehicle is an abstract class, while porche911 is not)

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

এখন, ইন্টারফেসটি DbWorkerসন্তুষ্ট করে IFooWorker, তবে যদি এই শ্রেণীর দ্বারা সুনির্দিষ্ট কোনও উপায় থাকে work()তবে এর উত্তরাধিকার সূত্রে প্রাপ্ত সংজ্ঞাটি ওভারলোড করা দরকার BaseWorker। এটি IFooWorkerসরাসরি ইন্টারফেসটি প্রয়োগ না করা উচিত কারণ এটি বিশেষ কিছু নয় DbWorker। আপনি যদি প্রতিবারের মতো ক্লাস প্রয়োগ করে থাকেন DbWorkerতবে আপনি লঙ্ঘন করছেন ডিআরওয়াই

যদি দুটি শ্রেণি একই উপায়ে বিভিন্ন উপায়ে প্রয়োগ করে তবে আপনি সর্বাধিক সাধারণ কমন সুপারক্লাসের সন্ধান করতে পারেন। বেশিরভাগ সময় আপনি একটি খুঁজে পাবেন। যদি তা না হয় তবে তা খুঁজছেন বা ছেড়ে দিন এবং মেনে নিন যে তাদের কাছে বেস শ্রেণি তৈরি করার মতো পর্যাপ্ত জিনিস সাধারণ নেই।


-3

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


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

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

1
সম্ভবত আপনি ইন্টারফেসে "শ্রমিক" শব্দটিতে আটকে আছেন stuck "ডাটাসোর্স" সম্পর্কে কী? আমাদের যদি একটি আইডিটিসোর্স থাকে <টি>, আমরা তুচ্ছভাবে একটি SQLDatasource <T>, রেস্টড্যাটাস্ত্রস <T>, মঙ্গোড্যাটাসোর্স <টি> পেতে পারি have ব্যবসায় সিদ্ধান্ত নেয় যে জেনেরিক ইন্টারফেসের কোন বন্ধকরণগুলি অ্যাবস্ট্রাক্ট ডেটাসোর্সগুলির সমাপনী বাস্তবায়নের দিকে যায়।
ব্রায়ান বোয়েচার

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