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


88

আমাকে একটি প্রশ্ন জিজ্ঞাসা করা হয়েছিল, আমি আমার উত্তরটি এখানে পর্যালোচনা করতে চেয়েছিলাম।

প্রশ্ন: কোন দৃশ্যে ইন্টারফেস (গুলি) প্রয়োগের পরিবর্তে একটি বিমূর্ত শ্রেণি বাড়ানো আরও উপযুক্ত?

উত্তর: আমরা যদি টেম্পলেট পদ্ধতি ডিজাইনের প্যাটার্ন ব্যবহার করি।

আমি কি সঠিক ?

আমি দুঃখিত যদি আমি স্পষ্টভাবে প্রশ্নটি না জানাতে পারি।
আমি বিমূর্ত শ্রেণি এবং ইন্টারফেসের মধ্যে প্রাথমিক পার্থক্য জানি।

1) অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করুন যখন প্রয়োজনটি এমন হয় যে আমাদের নির্দিষ্ট উপকরণের জন্য প্রতিটি সাবক্লাসে একই কার্যকারিতা প্রয়োগ করতে হবে (পদ্ধতিটি বাস্তবায়ন করুন) এবং অন্য কিছু ক্রিয়াকলাপের জন্য আলাদা কার্যকারিতা (কেবলমাত্র পদ্ধতি স্বাক্ষর)

২) ইন্টারফেস ব্যবহার করুন যদি আপনার স্বাক্ষরটি একই (এবং প্রয়োগকরণ পৃথক) হতে হয় তবে আপনি ইন্টারফেস প্রয়োগের সাথে সম্মতি রাখতে পারেন

3) আমরা একটি বিমূর্ত শ্রেণির সর্বাধিক প্রসারিত করতে পারি, তবে একাধিক ইন্টারফেস প্রয়োগ করতে পারি

প্রশ্নের পুনরাবৃত্তি: উপরোক্ত বর্ণনাকারী ছাড়াও কি অন্য কোন পরিস্থিতি রয়েছে, যেখানে বিশেষত আমাদের বিমূর্ত শ্রেণি ব্যবহার করা প্রয়োজন (একটাই দেখতে পাওয়া যায় যে টেমপ্লেট পদ্ধতিতে নকশার নকশাটি কেবলমাত্র এর উপর ভিত্তি করে তৈরি হয়েছে)?

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

এই দুটির মধ্যে চয়ন করা সত্যই আপনি যা করতে চান তার উপর নির্ভর করে তবে ভাগ্যক্রমে আমাদের জন্য, এরিক গামা আমাদের কিছুটা সহায়তা করতে পারে।

সর্বদা একটি বাণিজ্য বন্ধ রয়েছে, একটি ইন্টারফেস আপনাকে বেস শ্রেণীর সাথে স্বাধীনতা দেয়, একটি বিমূর্ত শ্রেণি আপনাকে পরে নতুন পদ্ধতি যুক্ত করার স্বাধীনতা দেয় । - এরিক গামা

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

Abstract classesপ্রাথমিকভাবে নিবিড়ভাবে সম্পর্কিত এমন বস্তুর জন্য ব্যবহার করা উচিত। Interfacesসম্পর্কযুক্ত ক্লাসগুলির জন্য সাধারণ কার্যকারিতা সরবরাহ করার ক্ষেত্রে আরও ভাল।




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

4
@ شپল্লু.মোকাদ্দ.আইম এটি কোনও পার্থক্য ছাড়াই পার্থক্য। আপনি এটি বিস্তৃত না করে কোনও বিমূর্ত ক্লাস ব্যবহার করতে পারবেন না। এখানে আপনার নিটপিকিং সম্পূর্ণ অর্থহীন বলে মনে হচ্ছে।
ব্যবহারকারী 207421

উত্তর:


87

ইন্টারফেস ব্যবহার করার সময়

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

অ্যাবস্ট্রাক্ট ক্লাস কখন ব্যবহার করবেন

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

উভয় কখন ব্যবহার করবেন

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


আমি মনে করি ওপি ইন্টারফেস বাস্তবায়নের পরিবর্তে কখন অ্যাবস্ট্রাক্ট ক্লাসটি বাড়ানো যায় তা জানতে চায়
শিপলু মোকাদ্দিম

@ শিপলু.মোকাদ্দ.আইম আসলে ওপি খুব সুনির্দিষ্ট প্রশ্ন জিজ্ঞাসা করেছিল, যার উত্তর হয় 'হ্যাঁ' বা 'না'।
ব্যবহারকারী 207421

4
তুমি ঠিক বলছো. তবে এসওতে আমরা হ্যাঁ / না এর যথাযথ ব্যাখ্যা দিয়ে উত্তর দিই।
শিপলু মোকাদ্দিম

4
@ শিপলু.মোকাদ্দ.আইম আমি দেখতে পাচ্ছি না কীভাবে এটি আপনাকে তার প্রশ্নের ভুল-বক্তব্য দেওয়ার লাইসেন্স দেয়।
ব্যবহারকারী 207421

কেবলমাত্র এই একক বক্তব্যের ভিত্তিতে If we are using template method design patternআমরা বলতে পারি না YESবাNO
DivineDesert

31

প্রশ্নের পুনরাবৃত্তি: উপরে উল্লিখিত এইগুলি ছাড়াও অন্য কোনও দৃশ্য রয়েছে যেখানে বিশেষত আমাদের বিমূর্ত শ্রেণি ব্যবহার করা প্রয়োজন (এটি দেখুন টেমপ্লেট পদ্ধতিতে নকশার প্যাটার্নটি কেবলমাত্র এটির উপর ভিত্তি করে তৈরি করা হয়েছে)

হ্যাঁ, আপনি যদি জ্যাকএক্সবি ব্যবহার করেন। এটি ইন্টারফেস পছন্দ করে না। আপনার হয় হয় বিমূর্ত ক্লাস ব্যবহার করা উচিত বা জেনারিক সহ এই সীমাবদ্ধতার চারপাশে কাজ করা উচিত।

একটি ব্যক্তিগত ব্লগ পোস্ট থেকে :

ইন্টারফেস:

  1. একটি শ্রেণি একাধিক ইন্টারফেস বাস্তবায়ন করতে পারে
  2. একটি ইন্টারফেস মোটেও কোনও কোড সরবরাহ করতে পারে না
  3. একটি ইন্টারফেস কেবল সর্বজনীন স্থিতিশীল চূড়ান্ত স্থিরতাগুলি সংজ্ঞায়িত করতে পারে
  4. একটি ইন্টারফেস উদাহরণ ভেরিয়েবলগুলি সংজ্ঞায়িত করতে পারে না
  5. একটি নতুন পদ্ধতি যুক্ত করার ফলে ক্লাস প্রয়োগের উপর নকশা প্রভাব পড়ে (নকশা রক্ষণাবেক্ষণ)
  6. জ্যাকএক্সবি ইন্টারফেসের সাথে ডিল করতে পারে না
  7. একটি ইন্টারফেস বিমূর্ত শ্রেণীর প্রসার বা প্রয়োগ করতে পারে না
  8. সমস্ত ইন্টারফেস পদ্ধতি জনসাধারণের

সাধারণভাবে, ইন্টারফেসগুলি চুক্তিগুলি সংজ্ঞায়িত করতে ব্যবহার করা উচিত (কী অর্জন করা যায়, কীভাবে তা অর্জন করা যায় না)।

বিমূর্ত শ্রেণি:

  1. একটি শ্রেণি সর্বাধিক একটি বিমূর্ত শ্রেণি প্রসারিত করতে পারে
  2. একটি বিমূর্ত শ্রেণিতে কোড থাকতে পারে
  3. একটি বিমূর্ত শ্রেণি স্থির এবং উদাহরণ উভয় স্থির সংজ্ঞা দিতে পারে (চূড়ান্ত)
  4. একটি বিমূর্ত শ্রেণি উদাহরণ ভেরিয়েবল সংজ্ঞায়িত করতে পারে
  5. বিদ্যমান বিমূর্ত শ্রেণীর কোড সংশোধন করাকে বর্ধমান শ্রেণিতে (বাস্তবায়ন রক্ষণাবেক্ষণ) প্রভাব রয়েছে
  6. একটি বিমূর্ত শ্রেণিতে একটি নতুন পদ্ধতি যুক্ত করার দ্বারা বর্ধিত শ্রেণীর উপর কোনও রেপাল প্রভাব নেই
  7. একটি বিমূর্ত শ্রেণি একটি ইন্টারফেস প্রয়োগ করতে পারে
  8. বিমূর্ত শ্রেণিগুলি ব্যক্তিগত এবং সুরক্ষিত পদ্ধতিগুলি প্রয়োগ করতে পারে

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


4
ইন্টারফেস # 8 এর জন্য জাভা 8 এ, আপনিও থাকতে পারেন defaultএবং staticপদ্ধতিগুলিও রাখতে পারেন ।
নবীন ব্যবহারকারী

15

ইন্টারফেসটি ব্যবহৃত হয় যখন আপনার দৃশ্যের সাথে দেখা যায় যে সমস্ত শ্রেণীর কাঠামোগত একই কাঠামোগত থাকে তবে সম্পূর্ণ কার্যকারিতা থাকে।

অ্যাবস্ট্রাক্ট বর্গ ব্যবহার করা হয় যখন আপনার দৃশ্যের সাথে দেখা যায় যে সমস্ত শ্রেণীর কাঠামোগত একই কাঠামো রয়েছে তবে কিছু একই এবং কিছু আলাদা কার্যকারিতা রয়েছে।

নিবন্ধটি একবার দেখুন: http://shoaibmk.blogspot.com/2011/09/abstract-class-is-class- which-cannot-be.html


10

এখানে প্রচুর দুর্দান্ত উত্তর রয়েছে তবে আমি প্রায়শই দুটি ইন্টারফেস এবং বিমূর্ত ক্লাস ব্যবহার করাই সর্বোত্তম রুট। এই স্বীকৃত উদাহরণ বিবেচনা করুন:

আপনি একটি বিনিয়োগ ব্যাংকে একটি সফ্টওয়্যার বিকাশকারী এবং আপনার এমন একটি সিস্টেম তৈরি করা দরকার যা বাজারে অর্ডার দেয়। আপনার ইন্টারফেসটি কোনও ট্রেডিং সিস্টেম কী করে তার সর্বাধিক সাধারণ ধারণাটি ধারণ করে ,

1) Trading system places orders
2) Trading system receives acknowledgements

এবং একটি ইন্টারফেসে ক্যাপচার করা যেতে পারে, ITradeSystem

public interface ITradeSystem{

     public void placeOrder(IOrder order);
     public void ackOrder(IOrder order);

}

এখন বিক্রয় ডেস্কে এবং অন্যান্য ব্যবসায়িক লাইনের সাথে কাজ করা প্রকৌশলীরা তাদের বিদ্যমান অ্যাপ্লিকেশনগুলিতে অর্ডার প্লেসমেন্ট কার্যকারিতা যুক্ত করতে আপনার সিস্টেমের সাথে ইন্টারফেস শুরু করতে পারেন । এবং আপনি এখনও নির্মাণ শুরু করেন নি! এটি ইন্টারফেসের শক্তি।

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

public class StockTradeSystem implements ITradeSystem{    

    @Override 
    public void placeOrder(IOrder order);
         getMarket().place(order);

    @Override 
    public void ackOrder(IOrder order);
         System.out.println("Order received" + order);    

    private void connectToMarket();
       SocketChannel sock = Socket.open();
       sock.bind(marketAddress); 
       <LOTS MORE MESSY CODE>
    }

    public void findGoodDeals();
       deals = <apply magic wizardry>
       System.out.println("The best stocks to buy are: " + deals);
    }

কংক্রিট বাস্তবায়নের মধ্যে এই অগোছালো পদ্ধতিগুলির প্রচুর পরিমাণ রয়েছে connectToMarket(), তবে findGoodDeals()প্রকৃতপক্ষে সমস্ত ব্যবসায়ীরাই যত্নশীল।

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

public abstract class ABCTradeSystem implements ITradeSystem{    

    public abstract void findGoodDeals();

    @Override 
    public void placeOrder(IOrder order);
         getMarket().place(order);

    @Override 
    public void ackOrder(IOrder order);
         System.out.println("Order received" + order);    

    private void connectToMarket();
       SocketChannel sock = Socket.open();
       sock.bind(marketAddress); 
       <LOTS MORE MESSY CODE>
    }

findGoodDeals()আপনি ইতিমধ্যে সংজ্ঞায়িত হিসাবে আপনার স্টক ট্রেডিং সিস্টেম প্রয়োগ করে ,

public class StockTradeSystem extends ABCTradeSystem{    

    public void findGoodDeals();
       deals = <apply magic wizardry>
       System.out.println("The best stocks to buy are: " + deals);
    }

তবে এখন FX হুইজ বাচ্চা findGoodDeals()মুদ্রার জন্য কেবল একটি বাস্তবায়ন সরবরাহ করে তার সিস্টেমটি তৈরি করতে পারে ; তাকে সকেট সংযোগ বা এমনকি ইন্টারফেসের পদ্ধতিগুলির পুনরায় প্রতিস্থাপন করতে হবে না!

public class CurrencyTradeSystem extends ABCTradeSystem{    

    public void findGoodDeals();
       ccys = <Genius stuff to find undervalued currencies>
       System.out.println("The best FX spot rates are: " + ccys);
    }

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

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


6

আপনার কোনটি ব্যবহার করা উচিত, বিমূর্ত ক্লাস বা ইন্টারফেস?

যদি এই বিবৃতিগুলির কোনও আপনার ব্যবহারের ক্ষেত্রে প্রয়োগ হয় তবে অ্যাবস্ট্রাক্ট ক্লাসগুলি ব্যবহার করার বিষয়টি বিবেচনা করুন:

আপনি কয়েকটি ঘনিষ্ঠভাবে সম্পর্কিত ক্লাসের মধ্যে কোড ভাগ করতে চান।

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

আপনি স্থিতিশীল বা চূড়ান্ত নয় এমন ক্ষেত্রগুলি ঘোষণা করতে চান। এটি আপনাকে এমন পদ্ধতিগুলি সংজ্ঞায়িত করতে সক্ষম করে যা তারা যার সাথে সম্পর্কিত তার অবস্থার অ্যাক্সেস এবং সংশোধন করতে পারে।

ইন্টারফেস ব্যবহার বিবেচনা করুন যদি এই বিবৃতিগুলির কোনও আপনার ব্যবহারের ক্ষেত্রে প্রযোজ্য:

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

আপনি কোনও নির্দিষ্ট ডেটা ধরণের আচরণ নির্দিষ্ট করতে চান তবে কে তার আচরণটি প্রয়োগ করে তা নিয়ে উদ্বিগ্ন নন।

আপনি একাধিক প্রকারের উত্তরাধিকারের সুযোগ নিতে চান।

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html


4

জাভা 8 রিলিজের সাথে ইন্টারফেসে নতুন ক্ষমতা যুক্ত করার সাথে গত তিন বছরে জিনিসগুলি অনেকগুলি পরিবর্তন করা হয়েছে।

ইন্টারফেসে ওরাকল ডকুমেন্টেশন পৃষ্ঠা থেকে :

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

আপনি আপনার প্রশ্নে উদ্ধৃত হিসাবে, বিমূর্ত শ্রেণি টেম্পলেট পদ্ধতি প্যাটার্নের জন্য উপযুক্ত যেখানে আপনাকে কঙ্কাল তৈরি করতে হবে। ইন্টারফেস ক্যান্ট এখানে ব্যবহার করা যেতে পারে।

ইন্টারফেসের চেয়ে বিমূর্ত শ্রেণিকে অগ্রাধিকার দেওয়ার জন্য আরও একটি বিবেচনা:

আপনার বেস ক্লাসে বাস্তবায়ন নেই এবং কেবলমাত্র সাব-ক্লাসগুলির নিজস্ব বাস্তবায়ন নির্ধারণ করতে হবে। আপনি উপ-শ্রেণীর সাথে রাজ্য ভাগ করতে চান বলে আপনার ইন্টারফেসের পরিবর্তে বিমূর্ত শ্রেণীর প্রয়োজন need

বিমূর্ত শ্রেণিটি প্রতিষ্ঠিত "একটি" সম্পর্কিত ক্লাস এবং ইন্টারফেস প্রদানের মধ্যে সম্পর্ক "একটি" সম্পর্কহীন শ্রেণীর মধ্যে ক্ষমতা "রয়েছে


আপনার প্রশ্নের দ্বিতীয় অংশ সম্পর্কে, যা জাভা -8 প্রকাশের আগে জাভা সহ বেশিরভাগ প্রোগ্রামিং ভাষার জন্য বৈধ

সর্বদা একটি বাণিজ্য বন্ধ রয়েছে, একটি ইন্টারফেস আপনাকে বেস শ্রেণীর সাথে স্বাধীনতা দেয়, একটি বিমূর্ত শ্রেণি আপনাকে পরে নতুন পদ্ধতি যুক্ত করার স্বাধীনতা দেয়। - এরিক গামা

আপনার কোডে অন্য অনেকগুলি জিনিস পরিবর্তন না করে আপনি কোনও ইন্টারফেসে যেতে পারবেন না

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

ডিফল্ট পদ্ধতিগুলি আপনাকে আপনার লাইব্রেরির ইন্টারফেসগুলিতে নতুন কার্যকারিতা যুক্ত করতে এবং সেই ইন্টারফেসগুলির পুরানো সংস্করণগুলির জন্য লিখিত কোডের সাথে বাইনারি সামঞ্জস্যতা নিশ্চিত করতে সক্ষম করে।

ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে তাদের মধ্যে একটি নির্বাচন করতে, ওরাকল ডকুমেন্টেশন পৃষ্ঠাটি উদ্ধৃত করে যে:

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

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

এই সম্পর্কিত প্রশ্নগুলি আরও বিশদ বিবরণ দেখুন:

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

একটি ইন্টারফেস এবং একটি বিমূর্ত শ্রেণীর মধ্যে পার্থক্যটি আমি কীভাবে ব্যাখ্যা করব?

সংক্ষেপে: ভারসাম্য এখন ইন্টারফেসের দিকে আরও ঝুঁকছে

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

কিছু ডিজাইনের ধরণগুলি টেমপ্লেটের পদ্ধতি নিদর্শন বাদে অ্যাবস্ট্রাক্ট ক্লাস (ওভার ইন্টারফেস) ব্যবহার করে।

সৃষ্টিশীল নিদর্শন:

বিমূর্ত_ কারখানা_পথ

কাঠামোগত নিদর্শন:

সাজসজ্জার_পাত্র

আচরণগত নিদর্শন:

মধ্যস্থ_পাত্র


এটি: "বিমূর্ত শ্রেণি প্রতিষ্ঠিত করে" "সম্পর্কিত ক্লাস এবং ইন্টারফেসের মধ্যে সম্পর্ক সরবরাহ করে" এর সাথে "সম্পর্কযুক্ত শ্রেণীর মধ্যে ক্ষমতা রয়েছে" is
গ্যাব্রিয়েল

3

আপনি সঠিক না। অনেক পরিস্থিতিতে আছে। এটি কেবলমাত্র একটি একক 8-শব্দের নিয়মে হ্রাস করা সম্ভব নয়।


4
আপনি অস্পষ্ট না হলে; আপনি যখনই পারেন একটি ইন্টারফেস ব্যবহার করুন;)
পিটার লরে

@ পিটারলাউরে হ্যাঁ, বিজ্ঞপ্তি যুক্তিগুলি আপনাকে কমিয়ে দেবেন না ;-)
ব্যবহারকারী 207421

এটি সর্বোপরি "স্ট্যাক ওভারফ্লো"। ;) আমার বক্তব্য হচ্ছে আপনি যদি সহজ ইন্টারফেস ব্যবহার করতে পারেন তবে তা করুন so অন্যথায় আপনার কাছে একটি বিমূর্ত ক্লাস ব্যবহার করা ছাড়া উপায় নেই। আমি এটিকে খুব জটিল হিসাবে দেখছি না।
পিটার লরে

আমি মনে করি আপনি আরও গঠনমূলক ধারণা দিতে পারেন। কিছু প্রতিনিধি পরিস্থিতিতে কথা মত /
Adams.H

3

সংক্ষিপ্ত উত্তরটি হ'ল, আপনার সন্ধান করা কিছু কার্যকারিতা ইতিমধ্যে এতে প্রয়োগ করা হলে বিমূর্ত শ্রেণীর প্রসারিত করুন

আপনি যদি ইন্টারফেসটি প্রয়োগ করেন তবে আপনাকে সমস্ত পদ্ধতি প্রয়োগ করতে হবে। তবে বিমূর্ত শ্রেণীর বিভিন্ন পদ্ধতির জন্য আপনার প্রয়োগের প্রয়োজন কম হতে পারে।

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


খাঁটি ভার্চুয়াল ফাংশনটির জন্য অতিরিক্ত রেফারেন্স অ্যাবস্ট্রাক্ট ক্লাস এবং ইন্টারফেসের রূপান্তর সম্পর্কে আরও অন্তর্দৃষ্টি যোগ করবে , Pure virtual functions can also be used where the method declarations are being used to define an interface - similar to what the interface keyword in Java explicitly specifies. In such a use, derived classes will supply all implementations. In such a design pattern, the abstract class which serves as an interface will contain only pure virtual functions, but no data members or ordinary methods. অংশ (1/2)
অভিজিৎ

অংশ (২/২) বিমূর্ত শ্রেণি এবং ইন্টারফেসের বিচ্যুতি উপরের শেষ লাইনটি দ্বারা no data members or ordinary methods[বিমূর্ত শ্রেণিতে] দ্বারা ব্যাখ্যা করা হয়েছে ।
অভিজিৎ

3

আমার মতে, মূল পার্থক্যটি এটি an interface can't contain non abstract methods while an abstract class can। সুতরাং যদি সাবক্লাসগুলি একটি সাধারণ আচরণ ভাগ করে নেয় তবে এই আচরণটি সুপার ক্লাসে প্রয়োগ করা যেতে পারে এবং এভাবে উপক্লাসে উত্তরাধিকার সূত্রে প্রাপ্ত হয়

এছাড়াও আমি "জাভা সফ্টওয়্যার আর্কিটেকচার ডিজাইনের প্যাটার্ন" বই থেকে নিম্নলিখিতটি উদ্ধৃত করেছি

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


2

অ্যাবস্ট্রাক্ট ক্লাস দুটি গুরুত্বপূর্ণ দিকের ইন্টারফেস থেকে পৃথক

  • তারা নির্বাচিত পদ্ধতিগুলির জন্য ডিফল্ট বাস্তবায়ন সরবরাহ করে (এটি আপনার উত্তর দ্বারা আবৃত)
  • বিমূর্ত ক্লাসগুলির স্টেট থাকতে পারে (উদাহরণস্বরূপ ভেরিয়েবল) - সুতরাং এটি ইন্টারফেসের জায়গায় আপনি তাদের ব্যবহার করতে চান এমন আরও একটি পরিস্থিতি

আমি সম্পূর্ণ করব যে ইন্টারফেসে ভেরিয়েবল থাকতে পারে তবে সেগুলি ডিফল্টরূপে চূড়ান্ত।
টমাসজ মুলারসিজিক

1

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


0

Abstract classes should be extended when you want to some common behavior to get extended। অ্যাবস্ট্রাক্ট সুপার বর্গের সাধারণ ব্যবহার থাকবে এবং এটি বিমূর্ত পদ্ধতি / নির্দিষ্ট আচরণকে সংজ্ঞায়িত করবে যা সাব ক্লাসগুলি প্রয়োগ করা উচিত should

Interfaces allows you to change the implementation anytime allowing the interface to be intact


0

এটি আমার বোঝার, আশা করি এটি সাহায্য করবে

বিমূর্ত শ্রেণি:

  1. উত্তরাধিকার সূত্রে সদস্য ভেরিয়েবল থাকতে পারে (ইন্টারফেসে করা যাবে না)
  2. কনস্ট্রাক্টর থাকতে পারে (ইন্টারফেসগুলি পারে না)
  3. এর পদ্ধতিগুলির যে কোনও দৃশ্যমানতা থাকতে পারে (যেমন: ব্যক্তিগত, সুরক্ষিত, ইত্যাদি - তবে সমস্ত ইন্টারফেসের পদ্ধতিগুলি পাবলিক)
  4. সংজ্ঞায়িত পদ্ধতি (একটি প্রয়োগের সাথে পদ্ধতি) থাকতে পারে

ইন্টারফেস:

  1. ভেরিয়েবল থাকতে পারে তবে এগুলি সমস্ত পাবলিক স্ট্যাটিক ফাইনাল ভেরিয়েবল
    • স্থির মান যা কোনও স্থির স্কোপ দিয়ে কখনও পরিবর্তন হয় না
    • অ স্ট্যাটিক ভেরিয়েবলগুলির একটি উদাহরণ প্রয়োজন এবং আপনি কোনও ইন্টারফেস ইনস্ট্যান্ট করতে পারবেন না
  2. সমস্ত পদ্ধতি বিমূর্ত (বিমূর্ত পদ্ধতিতে কোড নেই)
    • সমস্ত কোড আসলে ক্লাসে লিখতে হবে যা নির্দিষ্ট ইন্টারফেস প্রয়োগ করে

0

বিমূর্ত এবং ইন্টারফেসের ব্যবহার:

একটিতে "ইস-এ-সম্পর্ক" এবং অন্যটির "আছে-এ-সম্পর্ক" রয়েছে

ডিফল্ট বৈশিষ্ট্যগুলি বিমূর্তে সেট করা আছে এবং অতিরিক্ত বৈশিষ্ট্য ইন্টারফেসের মাধ্যমে প্রকাশ করা যেতে পারে।

উদাহরণ: -> মানবদেহে আমাদের কিছু ডিফল্ট বৈশিষ্ট্য রয়েছে যা খাওয়া, ঘুমানো ইত্যাদি but

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