অন্য ইন্টারফেস থেকে উত্তরাধিকার সূত্রে যদি কোনও ইন্টারফেসকে 'খালি' হিসাবে বিবেচনা করা হয়?


12

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

তবে অন্য ইন্টারফেস থেকে উত্তরাধিকার সূত্রে যদি কোনও ইন্টারফেসকে 'খালি' হিসাবে বিবেচনা করা হয়?

interface I1 { ... }
interface I2 { ... } //unrelated to I1

interface I3
    : I1, I2
{
    // empty body
}

যে কোনও কিছু প্রয়োগ করে I3তা বাস্তবায়ন করতে হবে I1এবং I2, উত্তরাধিকারসূত্রে বিভিন্ন শ্রেণীর বস্তুগুলি I3পরস্পরের পরিবর্তে (নীচে দেখুন) ব্যবহার করা যেতে পারে, তাই I3 খালি কল করা কি ঠিক ? যদি তাই হয় তবে এটির জন্য আর্কিটেকচারের আরও ভাল উপায় কী হতে পারে?

// with I3 interface
class A : I3 { ... }
class B : I3 { ... }

class Test {
    void foo() {
        I3 something = new A();
        something = new B();
        something.SomeI1Function();
        something.SomeI2Function();
    }
}

// without I3 interface
class A : I1, I2 { ... }
class B : I1, I2 { ... }

class Test {
    void foo() {
        I1 something = new A();
        something = new B();
        something.SomeI1Function();
        something.SomeI2Function(); // we can't do this without casting first
    }
}

1
প্যারামিটার / ক্ষেত্র ইত্যাদির ধরণ হিসাবে একাধিক ইন্টারফেস উল্লেখ করতে অক্ষম হওয়াই সি # / .নেটে একটি ডিজাইনের ত্রুটি।
কোডসইনচাউস

আমি মনে করি এই অংশটির স্থাপত্যের আরও ভাল উপায়টি একটি পৃথক প্রশ্নে যাওয়া উচিত। এই মুহূর্তে গৃহীত উত্তরের প্রশ্নের শিরোনামের সাথে কোনও সম্পর্ক নেই।
কাপল

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

এটি কী বোঝায় যে কোনও শ্রেণি যা I1 এবং I2 প্রয়োগ করে তবে I3 নয়, এটি ব্যবহার করতে সক্ষম হবে নাfoo ? (উত্তরটি যদি "হ্যাঁ" হয় তবে এগিয়ে যান!)
ব্যবহারকারী 253751

@Andy যতক্ষণ আমি সম্পূর্ণরূপে CodesInChaos দাবি যে এটি একটি এর সাথে একমত নই ত্রুটি যেমন, আমি পদ্ধতির উপর যে জেনেরিক টাইপ পরামিতি একটি সমাধান মনে করবেন না - এটি একটি টাইপ সম্মুখের পদ্ধতি বাস্তবায়ন ব্যবহৃত বুদ্ধিমান দায়িত্ব পাহাড় জমে যাই হোক না কেন পদ্ধতিটি কল করছে, যা ভুল বলে মনে হচ্ছে। সম্ভবত var : I1, I2 something = new A();স্থানীয় ভেরিয়েবলগুলির মতো কিছু বাক্য গঠন সুন্দর হবে (যদি আমরা কনরাদের উত্তরে উত্থাপিত ভাল পয়েন্টগুলি উপেক্ষা করি)
কাই

উত্তর:


27

আই 3 প্রয়োগকারী যে কোনও কিছুতে আই 1 এবং আই 2 প্রয়োগ করতে হবে এবং আই 3 উত্তরাধিকার সূত্রে বিভিন্ন শ্রেণীর আইটেমগুলি পরস্পরের পরিবর্তে ব্যবহার করা যাবে (নীচে দেখুন), তাই আই 3 খালি কল করা কি ঠিক? যদি তাই হয় তবে এটির চেয়ে ভাল উপায় কী হবে?

"Bundling" I1এবং I2মধ্যে I3অফার একটা চমৎকার (?) শর্টকাট, বা যেখানেই থাকুন না কেন আপনি চান উভয় বাস্তবায়িত হওয়ার জন্য সিনট্যাক্স চিনি কিছু বাছাই।

এই পদ্ধতির সমস্যাটি হ'ল আপনি অন্য বিকাশকারীদের সুস্পষ্টভাবে বাস্তবায়ন I1 এবং I2 পাশাপাশি থাকতে বাধা দিতে পারবেন না , তবে এটি উভয় উপায়েই কাজ করে না - যদিও : I3এর সমতুল্য : I1, I2, এর : I1, I2সমতুল্য নয় : I3। এমনকি যদি তারা কার্যত অভিন্ন হয় তবে এমন একটি শ্রেণি যা উভয়কে সমর্থন করে I1এবং সমর্থন I2হিসাবে সনাক্ত করা যায় না I3

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

void foo() {
    I1 something = new A();
    something = new B();
    something.SomeI1Function();
    something.SomeI2Function(); // we can't do this without casting first
}

ঠিক আছে, আপনি পারবেন না। তবে সম্ভবত এটি আসলে একটি ভাল চিহ্ন?

যদি I1এবং I2বিভিন্ন দায়িত্ব বোঝায় (অন্যথায় তাদের প্রথমে পৃথক করার প্রয়োজন হবে না), তবে সম্ভবত একবারে দুটি আলাদা দায়িত্ব পালনের foo()চেষ্টা করা এবং ভুল করা কি ভুল something?

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

সম্পাদনা করুন:

আপনি যদি fooপ্রয়োগ করে এমন কিছু গ্রহণ করে I1এবং I2এটি পৃথক প্যারামিটার হিসাবে পাস করতে পারে তা নিশ্চিত করার জন্য আপনি যদি জোর করে থাকেন :

void foo(I1 i1, I2 i2) 

এবং তারা একই জিনিস হতে পারে:

foo(something, something);

fooতারা একই উদাহরণ বা না থাকলে কী যত্ন করে ?

তবে যদি এটি যত্নশীল হয় (উদাহরণস্বরূপ কারণ তারা রাষ্ট্রহীন নয়), বা আপনি কেবল এটিকে কুৎসিত মনে করেন, তবে এর পরিবর্তে কেউ জেনেরিক ব্যবহার করতে পারে:

void Foo<T>(T something) where T: I1, I2

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

আমি I3 : I2, I1কিছুটা এমন ভাষাতে ইউনিয়ন ধরণের অনুকরণ করার প্রয়াস হিসাবে দেখছি যা বাক্সের বাইরে এটি সমর্থন করে না (সি # বা জাভা দেয় না, তবে ইউনিয়নের ধরণগুলি কার্যকরী ভাষায় বিদ্যমান)।

এমন একটি নির্মাণকে অনুকরণ করার চেষ্টা করা যা ভাষার দ্বারা প্রকৃতপক্ষে সমর্থিত হয় না প্রায়শই আঠালো। একইভাবে, সি # তে আপনি মিশ্রণগুলি অনুকরণ করতে চাইলে এক্সটেনশন পদ্ধতি এবং ইন্টারফেস ব্যবহার করতে পারেন । সম্ভব? হ্যাঁ. ভাল ধারণা? আমি নিশ্চিত নই.


4

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

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


তাই না? আপনি অবশ্যই একটি ক্লাসে দুটি ইন্টারফেস বাস্তবায়ন করতে পারেন। আপনি ইন্টারফেস উত্তরাধিকারী না, আপনি তাদের বাস্তবায়ন।
অ্যান্ডি

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

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

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

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

2

খালি ইন্টারফেসগুলি সাধারণত খারাপ অনুশীলন হিসাবে বিবেচিত হয়

আমি একমত নই চিহ্নিতকারী ইন্টারফেস সম্পর্কে পড়ুন ।

যেখানে একটি সাধারণ ইন্টারফেস কার্যকারিতা নির্দিষ্ট করে (পদ্ধতি ঘোষণার আকারে) যে একটি বাস্তবায়নকারী শ্রেণিকে সমর্থন করতে হবে, একটি মার্কার ইন্টারফেসটি এটি করার দরকার নেই। এই জাতীয় ইন্টারফেসের নিছক উপস্থিতি বাস্তবায়নকারী শ্রেণীর পক্ষ থেকে নির্দিষ্ট আচরণকে নির্দেশ করে।


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

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