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


469

আমার একটি সাক্ষাত্কারে আমাকে একটি ইন্টারফেস এবং একটি অ্যাবস্ট্রাক্ট শ্রেণীর মধ্যে পার্থক্য ব্যাখ্যা করতে বলা হয়েছে ।

এখানে আমার প্রতিক্রিয়া:

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

একটি জাভা ইন্টারফেসে ঘোষিত ভেরিয়েবলগুলি ডিফল্টরূপে চূড়ান্ত হয়। একটি বিমূর্ত শ্রেণিতে অ-চূড়ান্ত ভেরিয়েবল থাকতে পারে।

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

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

একটি ইন্টারফেস কেবল অন্য জাভা ইন্টারফেসকে প্রসারিত করতে পারে, একটি বিমূর্ত শ্রেণি অন্য জাভা শ্রেণি প্রসারিত করতে পারে এবং একাধিক জাভা ইন্টারফেস প্রয়োগ করতে পারে।

একটি জাভা ক্লাস একাধিক ইন্টারফেস বাস্তবায়ন করতে পারে তবে এটি কেবল একটি বিমূর্ত শ্রেণি প্রসারিত করতে পারে।

তবে সাক্ষাত্কারকারী সন্তুষ্ট হননি এবং আমাকে বলেছিলেন যে এই বিবরণটি " বুকিশ জ্ঞান " উপস্থাপন করে।

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

আমি ভুল হয়ে যেতে পারে যেখানে?


32
আপনার উত্তরটি দেখে মনে হচ্ছে আপনি এমন কিছু বলছেন যা আপনি বুঝতে পারছেন না? এটি এমনও হতে পারে যে আপনাকে কেবল সেইরকমকে বলার ধরণটি পরিবর্তন করতে হবে যা আরও আপনার নিজের শব্দের মতো লাগে।
কিরিল কোবেলেভ

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

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

7
জাভা 8 ইন্টারফেসে পদ্ধতি থাকতে পারে .. সুতরাং ওও ধারণার বাইরে এই তথাকথিত "পার্থক্য" যে কোনও দিন পরিবর্তন করতে পারে।
রিং বাহক

15
আপনার উত্তরটি নিয়ে আমার কোনও সমস্যা নেই এবং আমি মনে করি না যে 'বইয়ের জ্ঞান' নিয়ে সাক্ষাত্কারের কোনও দোষ নেই। সাক্ষাত্কারকারীরা সবসময় তাদের জিজ্ঞাসা করা প্রশ্নের সঠিক উত্তর জানেন না এবং কিছু সাক্ষাত্কার কেবল আপনাকে সেখানে কাজ না করার জন্য সতর্ক করে দেয়।
মারকুইস

উত্তর:


513

আমি আপনাকে প্রথমে একটি উদাহরণ দেব:

public interface LoginAuth{
   public String encryptPassword(String pass);
   public void checkDBforUser();
}

মনে করুন আপনার আবেদনে 3 টি ডাটাবেস রয়েছে। তারপরে সেই ডাটাবেসের জন্য প্রতিটি প্রয়োগের জন্য উপরের 2 টি পদ্ধতি নির্ধারণ করা দরকার:

public class DBMySQL implements LoginAuth{
          // Needs to implement both methods
}
public class DBOracle implements LoginAuth{
          // Needs to implement both methods
}
public class DBAbc implements LoginAuth{
          // Needs to implement both methods
}

তবে যদি encryptPassword()ডাটাবেস নির্ভর না হয় এবং প্রতিটি শ্রেণীর জন্য এটি একই হয়? তাহলে উপরেরটি ভাল পন্থা হবে না।

পরিবর্তে, এই পদ্ধতির বিবেচনা করুন:

public abstract class LoginAuth{
   public String encryptPassword(String pass){
            // Implement the same default behavior here 
            // that is shared by all subclasses.
   }

   // Each subclass needs to provide their own implementation of this only:
   public abstract void checkDBforUser();
}

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


97
আমি নিশ্চিত নই যে এটি সত্যই পার্থক্যটি ব্যাখ্যা করেছে ... অবশ্যই এটি একটি দুর্দান্ত কৌশল। আমি মনে করি এটি জাভা 8 দ্বারা অবশেষে স্বীকার করেছে যে সি ++ সঠিক ছিল এবং একাধিক উত্তরাধিকার সম্পন্ন হতে পারে এবং এর একটি ব্যবহার থাকতে পারে এবং তাই ইন্টারফেসগুলি এখন কেবল ফাংশন স্বাক্ষরগুলিই সংজ্ঞায়িত করতে পারে না তবে ডিফল্ট বাস্তবায়নও সরবরাহ করতে পারে। যেমন একটি ইন্টারফেস ব্যবহার করা পছন্দনীয় হবে।
thecoshman

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

1
সুতরাং, আমি অনুমান করি যে এরপরে বলা বাহুল্য যে ইন্টারফেসগুলির সাথে, যা সংজ্ঞায়িত করা হয়েছে তার বাস্তবায়নটি ক্লাসের উপর নির্ভর করে যা আসলে ইন্টারফেস প্রয়োগ করে, যেখানে একটি বিমূর্ত শ্রেণীর স্টাফ ক্লাসের জন্য "মূল" হয় যা শ্রেণি প্রসারিত করে; অর্থাত্‍ এটি পরিবর্তন হয় না।
orrymr

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

3
@ হিরাদনিকু দেরী মন্তব্যের জন্য দুঃখিত, তবে আমি কেবল এই সুতোতে হোঁচট খেয়েছি। আপনি শ্রেণীর উত্তরাধিকারকে আইএস-এ সম্পর্ক হিসাবেও বিবেচনা করতে পারেন, যেখানে ইন্টারফেসগুলি "একটি নির্দিষ্ট কার্যকারিতা রয়েছে" বলে উল্লেখ করে।
আলেকজান্ডার জ্যাঙ্ক

206

এই পৃথিবীতে কিছুই নিখুঁত নয়। তারা সম্ভবত ব্যবহারিক পদ্ধতির আরও প্রত্যাশা করছেন।

তবে আপনার ব্যাখ্যার পরে আপনি কিছুটা ভিন্ন পদ্ধতির সাথে এই লাইনগুলি যুক্ত করতে পারেন।

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

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

  3. বিমূর্ত শ্রেণিতে বিমূর্ত ঘোষণা, কংক্রিট বাস্তবায়ন বা উভয়ই থাকতে পারে।

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

  5. তদুপরি, একই স্বাক্ষরযুক্ত যে পদ্ধতিগুলি বিভিন্ন প্রসঙ্গে আচরণের পরিবর্তন করতে পারে সেগুলি বিভিন্ন প্রসঙ্গে যথাযথভাবে প্রয়োগ করার নিয়ম হিসাবে ইন্টারফেসের ঘোষণা হিসাবে সরবরাহ করা হয়।

সম্পাদনা করুন: জাভা 8 ইন্টারফেসে ডিফল্ট এবং স্থির পদ্ধতিগুলি নির্ধারণ করতে সহায়তা করে facil

public interface SomeInterfaceOne {

    void usualAbstractMethod(String inputString);

    default void defaultMethod(String inputString){
        System.out.println("Inside SomeInterfaceOne defaultMethod::"+inputString);
    }
}

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

নিম্নলিখিত পদ্ধতিগুলির সাথে আমাদের যদি অন্য ইন্টারফেস থাকে:

public interface SomeInterfaceTwo {

    void usualAbstractMethod(String inputString);

    default void defaultMethod(String inputString){
        System.out.println("Inside SomeInterfaceTwo defaultMethod::"+inputString);
    }

}

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

SomeInterfaceOne and SomeInterfaceTwo

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


11
+1, বিভ্রান্তি এড়াতে এটি সত্যিই একটি ভাল উত্তর। কিন্তু আমি কোনও লিঙ্ক দেখতে পাইনি এবং কেন আপনি এই মূল্যবান রেখাগুলির উদ্ধৃতি দিয়েছিলেন কোনও ধারণা নেই। সম্ভব হলে পয়েন্ট হিসাবে তাদের তৈরি করুন :)।
সুরেশ আত্তা

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

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

৪. কংক্রিট বাস্তবায়নগুলিও নিয়ম, ডিফল্ট বাস্তবায়ন।
লুটেন

@ লুটেন: আমার জ্ঞান অনুসারে, আপনি যদি কোনও সমস্যা ছাড়াই কোনও নিয়ম এড়াতে / উপেক্ষা করতে পারেন, তবে এটি অবশ্যই একটি নির্দেশিকা নয়, কোনও নিয়ম নয়। আমি ভুল হলে আমাকে সংশোধন করুন।
শৈলেশ সাক্সেনা

168

আপনি ব্যবহার এবং প্রয়োগের ক্ষেত্রে ব্যবহারিক পার্থক্যের একটি ভাল সংক্ষিপ্তসার তৈরি করেছেন তবে অর্থের পার্থক্য সম্পর্কে কিছুই বলেননি।

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

একটি বিমূর্ত শ্রেণি বিভিন্ন সাবক্লাসের জন্য এমন ভিত্তি যা আচরণ ভাগ করে নেয় যা বারবার তৈরি করার প্রয়োজন হয় না। উপশ্রেণী আচরণ সম্পূর্ণ পূর্বনির্ধারিত আচরণ বাতিল করার বিকল্পও থাকবে (যতদিন এটি হিসাবে সংজ্ঞায়িত করা হয় না উচিত নয় finalবা private)।

আপনি java.utilপ্যাকেজে ভাল উদাহরণগুলি দেখতে পাবেন যার মধ্যে ইন্টারফেসের মতো Listএবং বিমূর্ত ক্লাস রয়েছে AbstractListযা ইতিমধ্যে ইন্টারফেস প্রয়োগ করে। সরকারী ডকুমেন্টেশন বর্ণনা AbstractListনিম্নরূপ:

এই শ্রেণিটি "এলোমেলো অ্যাক্সেস" ডেটা স্টোর (যেমন একটি অ্যারে) দ্বারা সমর্থনযুক্ত এই ইন্টারফেসটি বাস্তবায়নের জন্য প্রয়োজনীয় প্রচেষ্টাটি কমাতে তালিকা ইন্টারফেসের একটি কঙ্কাল বাস্তবায়ন সরবরাহ করে।


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

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

85

একটি ইন্টারফেস সিঙ্গলটন ভেরিয়েবল (পাবলিক স্ট্যাটিক ফাইনাল) এবং পাবলিক বিমূর্ত পদ্ধতি নিয়ে গঠিত। আমরা সাধারণত যখন রিয়েল টাইমে একটি ইন্টারফেস ব্যবহার করতে পছন্দ করি তখন যখন আমরা কী করতে জানি তবে কীভাবে এটি করতে হয় তা জানি না

এই ধারণাটি উদাহরণের মাধ্যমে আরও ভালভাবে বোঝা যায়:

পেমেন্ট ক্লাস বিবেচনা করুন। পেপ্যাল, ক্রেডিট কার্ড ইত্যাদির মতো পেমেন্ট বিভিন্ন উপায়ে করা যায়। সুতরাং আমরা সাধারণত makePayment()পেমেন্টকে আমাদের ইন্টারফেস হিসাবে গ্রহণ করি যা একটি পদ্ধতি রয়েছে এবং ক্রেডিটকার্ড এবং পেপাল দুটি বাস্তবায়ন ক্লাস।

public interface Payment
{
    void makePayment();//by default it is a abstract method
}
public class PayPal implements Payment
{
    public void makePayment()
    {
        //some logic for PayPal payment
        //e.g. Paypal uses username and password for payment
    }
}
public class CreditCard implements Payment
{
    public void makePayment()
    {
        //some logic for CreditCard payment
        //e.g. CreditCard uses card number, date of expiry etc...
    }
}

উপরের উদাহরণে ক্রেডিটকার্ড এবং পেপাল দুটি বাস্তবায়ন শ্রেণি / কৌশল। একটি ইন্টারফেস আমাদের জাভাতে একাধিক উত্তরাধিকার ধারণারও মঞ্জুরি দেয় যা কোনও বিমূর্ত শ্রেণীর দ্বারা সম্পন্ন করা যায় না।

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

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

public abstract class Burger
{
    public void packing()
    {
        //some logic for packing a burger
    }
    public abstract void price(); //price is different for different categories of burgers
}
public class VegBerger extends Burger
{
    public void price()
    {
        //set price for a veg burger.
    }
}
public class NonVegBerger extends Burger
{
    public void price()
    {
        //set price for a non-veg burger.
    }
}

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

অন্যান্য পার্থক্য রয়েছে তবে এগুলি হ'ল প্রধান যা আপনার সাক্ষাত্কারকারীর প্রত্যাশা অনুযায়ী ছিল। আশা করি এটি সহায়ক ছিল।


1
ওয়েল, এই উত্তর তোলে অনেক অনুভূতি, এবং এটি উদাহরণ বেশ পরিষ্কার, আমরা যখন মধ্যবর্তী নির্বাচন জমি interfaceএবং abstract class
ম্যাক

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

45

অ্যাবস্ট্যাক্ট শ্রেণি এবং ইন্টারফেসের মধ্যে পার্থক্য

  1. জাভা 8-এ অ্যাবস্ট্রাক্ট ক্লাস বনাম ইন্টারফেস
  2. ধারণাগত পার্থক্য:

জাভা 8 এ ইন্টারফেস ডিফল্ট পদ্ধতি

  1. ডিফল্ট পদ্ধতি কী?
  2. ডিফল্ট পদ্ধতি ব্যবহার করে প্রতিটি পদ্ধতি সংকলনের ত্রুটি সমাধান করা হয়েছে
  3. ডিফল্ট পদ্ধতি এবং একাধিক উত্তরাধিকার দ্ব্যর্থতা সমস্যা
  4. জাভা ইন্টারফেস ডিফল্ট পদ্ধতি সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট:

জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি

  1. জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি, কোড উদাহরণ, স্থির পদ্ধতি বনাম ডিফল্ট পদ্ধতি
  2. জাভা ইন্টারফেস স্থির পদ্ধতি সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট:

জাভা ফাংশনাল ইন্টারফেস



জাভা 8-এ অ্যাবস্ট্রাক্ট ক্লাস বনাম ইন্টারফেস

জাভা 8 ইন্টারফেস পরিবর্তনগুলি ইন্টারফেসে স্থির পদ্ধতি এবং ডিফল্ট পদ্ধতি অন্তর্ভুক্ত করে। জাভা 8 এর পূর্বে, আমাদের ইন্টারফেসগুলিতে কেবল পদ্ধতি ঘোষণা থাকতে পারে। তবে জাভা 8 থেকে, আমাদের ইন্টারফেসগুলিতে ডিফল্ট পদ্ধতি এবং স্থির পদ্ধতি থাকতে পারে।

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

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

ধারণাগত পার্থক্য:

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

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

জাভা 8 এ ইন্টারফেস ডিফল্ট পদ্ধতি

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

এটি কীভাবে কাজ করে তা বুঝতে ছোট উদাহরণ বিবেচনা করুন:

public interface OldInterface {
    public void existingMethod();
 
    default public void newDefaultMethod() {
        System.out.println("New default method"
               + " is added in interface");
    }
}

নিম্নলিখিত ক্লাসটি জাভা জেডিকে 8 তে সফলভাবে সংকলন করবে,

public class OldInterfaceImpl implements OldInterface {
    public void existingMethod() {
     // existing implementation is here…
    }
}

আপনি যদি ওল্ডআইন্টারফেসআইএমপিএল এর উদাহরণ তৈরি করেন:

OldInterfaceImpl obj = new OldInterfaceImpl ();
// print “New default method add in interface”
obj.newDefaultMethod(); 

ডিফল্ট পদ্ধতি:

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

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

ডিফল্ট পদ্ধতিগুলি এই ইন্টারফেসগুলির পুরানো বাস্তবায়ন ভঙ্গ না করে বিদ্যমান ইন্টারফেসগুলিতে নতুন কার্যকারিতা যুক্ত করতে সক্ষম করে।

যখন আমরা একটি ইন্টারফেস প্রসারিত করি যেখানে একটি ডিফল্ট পদ্ধতি রয়েছে, আমরা নিম্নলিখিতটি সম্পাদন করতে পারি,

  1. ডিফল্ট পদ্ধতি ওভাররাইড না করে ডিফল্ট পদ্ধতির উত্তরাধিকারী হবে।
  2. আমরা সাবক্লাসে ওভাররাইড করা অন্যান্য পদ্ধতির মতো ডিফল্ট পদ্ধতি ওভাররাইড করে।
  3. বিমূর্ত হিসাবে পুনরায় ঘোষিত ডিফল্ট পদ্ধতি, যা সাবক্লাসকে ওভাররাইড করতে বাধ্য করে।

ডিফল্ট পদ্ধতি ব্যবহার করে প্রতিটি পদ্ধতি সংকলনের ত্রুটি সমাধান করা হয়েছে

জাভা 8-র জন্য, জেডিকে সংগ্রহগুলি প্রসারিত করা হয়েছে এবং প্রতিটি সংগ্রহের জন্য পুরো সংগ্রহটিতে (যা ল্যাম্বডাসের সাথে কাজ করে) যুক্ত করা হয়েছে is প্রচলিত উপায়ে, কোডটি নীচের মত দেখাচ্ছে,

public interface Iterable<T> {
    public void forEach(Consumer<? super T> consumer);
}

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

ডিফল্ট পদ্ধতি সহ ইটেবল ইন্টারফেসটি নীচে রয়েছে,

public interface Iterable<T> {
    public default void forEach(Consumer
                   <? super T> consumer) {
        for (T t : this) {
            consumer.accept(t);
        }
    }
}

বাস্তবায়নকারী ক্লাসগুলি না ভেঙে জেডিকে ইন্টারফেসে স্ট্রিম যুক্ত করতে একই প্রক্রিয়া ব্যবহার করা হয়েছে ।


ডিফল্ট পদ্ধতি এবং একাধিক উত্তরাধিকার দ্ব্যর্থতা সমস্যা

যেহেতু জাভা ক্লাস একাধিক ইন্টারফেস বাস্তবায়ন করতে পারে এবং প্রতিটি ইন্টারফেস একই পদ্ধতির স্বাক্ষরের সাথে ডিফল্ট পদ্ধতিটি সংজ্ঞায়িত করতে পারে, সুতরাং উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতিগুলি একে অপরের সাথে বিরোধ করতে পারে।

নীচে উদাহরণ বিবেচনা করুন,

public interface InterfaceA {  
       default void defaultMethod(){  
           System.out.println("Interface A default method");  
    }  
}
 
public interface InterfaceB {
   default void defaultMethod(){
       System.out.println("Interface B default method");
   }
}
 
public class Impl implements InterfaceA, InterfaceB  {
}

উপরের কোডটি নিম্নলিখিত ত্রুটির সাথে সংকলন করতে ব্যর্থ হবে,

জাভা: ক্লাস ইমপ্ল ইন্টারফেসএ এবং ইন্টারফেসবি টাইপ থেকে ডিফল্টমেথড () এর জন্য সম্পর্কযুক্ত ডিফল্ট উত্তরাধিকার সূত্রে প্রাপ্ত

এই শ্রেণিটি ঠিক করতে, আমাদের ডিফল্ট পদ্ধতি প্রয়োগের প্রয়োজন:

public class Impl implements InterfaceA, InterfaceB {
    public void defaultMethod(){
    }
}

তদুপরি, আমরা যদি আমাদের নিজস্ব প্রয়োগের পরিবর্তে সুপার ইন্টারফেসের কোনও দ্বারা সরবরাহিত ডিফল্ট বাস্তবায়ন প্রার্থনা করতে চাই তবে আমরা নীচের মতো এটি করতে পারি,

public class Impl implements InterfaceA, InterfaceB {
    public void defaultMethod(){
        // existing code here..
        InterfaceA.super.defaultMethod();
    }
}

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

জাভা ইন্টারফেস ডিফল্ট পদ্ধতি সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট:

  1. জাভা ইন্টারফেসের ডিফল্ট পদ্ধতিগুলি বাস্তবায়ন ক্লাস ভাঙার ভয় ছাড়াই আমাদের ইন্টারফেসগুলি প্রসারিত করতে সহায়তা করবে।
  2. জাভা ইন্টারফেস ডিফল্ট পদ্ধতি ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে পার্থক্য কমিয়ে দেয়।
  3. জাভা 8 ইন্টারফেসের ডিফল্ট পদ্ধতিগুলি ইউটিলিটি ক্লাসগুলি এড়াতে আমাদের সহায়তা করবে, যেমন সমস্ত সংগ্রহ শ্রেণির পদ্ধতি ইন্টারফেসে নিজেই সরবরাহ করা যেতে পারে।
  4. জাভা ইন্টারফেসের ডিফল্ট পদ্ধতিগুলি বেস বাস্তবায়ন ক্লাসগুলি অপসারণে আমাদের সহায়তা করবে, আমরা ডিফল্ট বাস্তবায়ন সরবরাহ করতে পারি এবং বাস্তবায়ন ক্লাসগুলি বেছে নিতে পারে কোনটি ওভাররাইড করা উচিত।
  5. ইন্টারফেসে ডিফল্ট পদ্ধতি প্রবর্তনের অন্যতম প্রধান কারণ লাম্বদা এক্সপ্রেশন সমর্থন করার জন্য জাভা 8-তে সংগ্রহের API উন্নত করা।
  6. শ্রেণিবিন্যাসের যে কোনও শ্রেণির যদি একই স্বাক্ষরযুক্ত কোনও পদ্ধতি থাকে তবে ডিফল্ট পদ্ধতিগুলি অপ্রাসঙ্গিক হয়ে যায়। একটি ডিফল্ট পদ্ধতি java.lang.Object থেকে কোনও পদ্ধতিকে ওভাররাইড করতে পারে না। যুক্তিটি খুব সহজ, কারণ কারণ জাভা সমস্ত জাভা শ্রেণীর জন্য বেস শ্রেণি। সুতরাং যদি আমাদের ইন্টারফেসগুলিতে ডিফল্ট পদ্ধতি হিসাবে অবজেক্ট শ্রেণির পদ্ধতিগুলি সংজ্ঞায়িত করা হয় তবে এটি অকেজো হবে কারণ অবজেক্ট শ্রেণির পদ্ধতিটি সর্বদা ব্যবহৃত হবে। এই কারণেই বিভ্রান্তি এড়াতে, আমাদের ডিফল্ট পদ্ধতি থাকতে পারে না যা অবজেক্ট শ্রেণির পদ্ধতিগুলিকে ওভাররাইড করে।
  7. জাভা ইন্টারফেসের ডিফল্ট পদ্ধতিগুলিকে ডিফেন্ডার পদ্ধতি বা ভার্চুয়াল এক্সটেনশন পদ্ধতি হিসাবেও উল্লেখ করা হয়।

সংস্থান লিঙ্ক:

  1. জাভা 8-এ অ্যাবস্ট্রাক্ট বনাম ডিফল্ট পদ্ধতিগুলির সাথে ইন্টারফেস
  2. জেডিকে 8 এর যুগে বিমূর্ত শ্রেণি বনাম ইন্টারফেস
  3. ভার্চুয়াল এক্সটেনশন পদ্ধতিগুলির মাধ্যমে ইন্টারফেস বিবর্তন

জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি

জাভা ইন্টারফেস স্ট্যাটিক পদ্ধতি, কোড উদাহরণ, স্থির পদ্ধতি বনাম ডিফল্ট পদ্ধতি

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

public interface MyData {

    default void print(String str) {
        if (!isNull(str))
            System.out.println("MyData Print::" + str);
    }

    static boolean isNull(String str) {
        System.out.println("Interface Null Check");

        return str == null ? true : "".equals(str) ? true : false;
    }
}

এখন আসুন এমন একটি বাস্তবায়ন শ্রেণি দেখুন যা নিখরচায় বাস্তবায়নের সাথে ইস্কুল () পদ্ধতি রয়েছে।

public class MyDataImpl implements MyData {

    public boolean isNull(String str) {
        System.out.println("Impl Null Check");

        return str == null ? true : false;
    }

    public static void main(String args[]){
        MyDataImpl obj = new MyDataImpl();
        obj.print("");
        obj.isNull("abc");
    }
}

মনে রাখবেন যে isNull (স্ট্রিং স্ট্রিং) একটি সাধারণ শ্রেণিবদ্ধ পদ্ধতি, এটি ইন্টারফেস পদ্ধতিটি ওভাররাইড করে না। উদাহরণস্বরূপ, আমরা যদি @ ওভাররাইড টীকাটি isNull () পদ্ধতিতে যুক্ত করব তবে এর ফলে সংকলক ত্রুটি হবে।

এখন যখন আমরা অ্যাপ্লিকেশনটি চালাব, আমরা নিম্নলিখিত আউটপুট পাব।

ইন্টারফেস নাল চেক

ইমপ্ল নাল চেক

যদি আমরা স্থিতিশীল থেকে ডিফল্টরূপে ইন্টারফেস পদ্ধতিটি তৈরি করি তবে আমরা নিম্নলিখিত আউটপুট পাব।

ইমপ্ল নাল চেক

মাইডাটা প্রিন্ট ::

ইমপ্ল নাল চেক

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

boolean result = MyData.isNull("abc");

জাভা ইন্টারফেস স্থির পদ্ধতি সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট:

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

জাভা ফাংশনাল ইন্টারফেস

পোস্টটি শেষ করার আগে আমি ফাংশনাল ইন্টারফেসগুলির একটি সংক্ষিপ্ত পরিচিতি সরবরাহ করতে চাই। ঠিক একটি বিমূর্ত পদ্ধতিযুক্ত একটি ইন্টারফেস ফাংশনাল ইন্টারফেস হিসাবে পরিচিত।

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

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

সংস্থান অবস্থান:

  1. জাভা 8 ইন্টারফেস পরিবর্তন - স্থির পদ্ধতি, ডিফল্ট পদ্ধতি

8
আমি ঠিক এই ধরণের আপডেট হওয়া উত্তরগুলির সন্ধান করছি। দ্রুত সাড়া দেওয়ার জন্য ধন্যবাদ.
রবীন্দ্র বাবু

41

আপনার প্রথম বিবৃতি (জাভা 8 প্রকাশের পরে) ব্যতীত আপনার সমস্ত বিবৃতি বৈধ are

একটি জাভা ইন্টারফেসের পদ্ধতিগুলি সুস্পষ্টভাবে বিমূর্ত এবং এগুলি বাস্তবায়ন করতে পারে না

ডকুমেন্টেশন পৃষ্ঠা থেকে :

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

পদ্ধতির সংস্থাগুলি কেবলমাত্র ডিফল্ট পদ্ধতি এবং স্থির পদ্ধতির জন্যই বিদ্যমান।

ডিফল্ট পদ্ধতি:

একটি ইন্টারফেসের ডিফল্ট পদ্ধতি থাকতে পারে তবে বিমূর্ত শ্রেণীর বিমূর্ত পদ্ধতিগুলির চেয়ে পৃথক।

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

যখন আপনি একটি ইন্টারফেস প্রসারিত করেন যেখানে একটি ডিফল্ট পদ্ধতি রয়েছে, আপনি নিম্নলিখিতটি করতে পারেন:

  1. ডিফল্ট পদ্ধতিটি মোটেই উল্লেখ করবেন না, যা আপনার বর্ধিত ইন্টারফেসটিকে ডিফল্ট পদ্ধতির উত্তরাধিকারী করে।
  2. ডিফল্ট পদ্ধতিটি পুনরায় ঘোষণা করুন, যা এটি তৈরি করে abstract
  3. ডিফল্ট পদ্ধতিটি পুনরায় সংজ্ঞা দিন, যা এটিকে ওভাররাইড করে।

স্থির পদ্ধতি:

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

এটি আপনার লাইব্রেরিতে সহায়তার পদ্ধতিগুলি পরিচালনা করা আপনার পক্ষে সহজ করে তোলে;

interfaceথাকার staticএবং defaultপদ্ধতি সম্পর্কে ডকুমেন্টেশন পৃষ্ঠা থেকে কোড উদাহরণ ।

import java.time.*;

public interface TimeClient {
    void setTime(int hour, int minute, int second);
    void setDate(int day, int month, int year);
    void setDateAndTime(int day, int month, int year,
                               int hour, int minute, int second);
    LocalDateTime getLocalDateTime();

    static ZoneId getZoneId (String zoneString) {
        try {
            return ZoneId.of(zoneString);
        } catch (DateTimeException e) {
            System.err.println("Invalid time zone: " + zoneString +
                "; using default time zone instead.");
            return ZoneId.systemDefault();
        }
    }

    default ZonedDateTime getZonedDateTime(String zoneString) {
        return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
    }
}

ইন্টারফেস বা বিমূর্ত শ্রেণীর ব্যবহার করতে হবে তা চয়ন করতে নীচের নির্দেশিকাগুলি ব্যবহার করুন।

ইন্টারফেস:

  1. একটি চুক্তি সংজ্ঞায়িত করতে (পছন্দমত রাষ্ট্রবিহীন - মানে কোনও ভেরিয়েবল নয়)
  2. সম্পর্কযুক্ত ক্লাসগুলির সাথে লিঙ্ক করার একটি ক্ষমতা রয়েছে।
  3. জনসাধারণের ধ্রুবক ভেরিয়েবলগুলি ঘোষণা করতে ( অপরিবর্তনীয় রাষ্ট্র )

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

  1. বিভিন্ন ঘনিষ্ঠভাবে সম্পর্কিত ক্লাসের মধ্যে কোড ভাগ করুন। এটি একটি সম্পর্ক স্থাপন করে ।

  2. সম্পর্কিত ক্লাসগুলির মধ্যে সাধারণ রাজ্য ভাগ করুন (কংক্রিটের শ্রেণিতে রাষ্ট্র পরিবর্তন করা যেতে পারে)

সম্পর্কিত পোস্ট:

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

উপাদানগুলি বনাম প্রসারিত: কখন ব্যবহার করবেন? পার্থক্য কি?

এই উদাহরণগুলির মধ্যে দিয়ে আপনি বুঝতে পারবেন

সম্পর্কিত না হওয়া ক্লাসগুলির ইন্টারফেসের মাধ্যমে ক্ষমতা থাকতে পারে তবে সম্পর্কিত ক্লাসগুলি বেস ক্লাসগুলির সম্প্রসারণের মাধ্যমে আচরণ পরিবর্তন করে।


"রাষ্ট্রবিহীন চুক্তি" বলতে কী বোঝ? এটি ইন্টারফেস সম্পর্কে আইটেম 1
মাকসিম দিমিত্রিভ

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

1
উপরের বিবৃতিতে সংশোধন। ইন্টারফেসে, ডেটা বিমূর্ত শ্রেণীর মত বিবর্তিত হতে পারে না
রবীন্দ্র বাবু

2
এটি সেরা উত্তর। এটি কেবল জাভা 8 কেই সম্বোধন করে না, তবে আপনি কোনটি কোন পরিস্থিতিতে ব্যবহার করবেন তাও এটি ব্যাখ্যা করে।
শুক্লসওয়াগ

statelessইন্টারফেসের ধারণাটি একটি দুর্দান্ত হিট। ইন্টারফেসের কোনও রাজ্য থাকতে পারে না (ইন্টারফেসের ধ্রুবক থাকতে পারে তবে তারা চূড়ান্ত / স্থির এইরকম অপরিবর্তনীয়)।
কাইহুয়া

22

আপনার ব্যাখ্যাটি শালীন দেখাচ্ছে, তবে আপনি কি কোনও পাঠ্যপুস্তক থেকে এটি পড়ছেন বলে মনে হচ্ছে? : - /

আমি যা নিয়ে বেশি উদ্বিগ্ন তা হ'ল আপনার উদাহরণটি কতটা দৃ solid়? আপনি কি বিমূর্ত এবং ইন্টারফেসের মধ্যে প্রায় সমস্ত পার্থক্য অন্তর্ভুক্ত বিরক্ত করেছেন ?

ব্যক্তিগতভাবে, আমি এই লিঙ্কটি পরামর্শ দেব: http://mindprod.com/jgloss/interfacevsabstract.html#TABLE

পার্থক্যের একটি সম্পূর্ণ তালিকা জন্য ..

আশা করি এটি আপনাকে এবং অন্যান্য পাঠকদের তাদের ভবিষ্যতের সাক্ষাত্কারে সহায়তা করবে


1
লিংক ভাগ করা হয় সত্যিই অসাধারণ বটে
Premraj

আপনি জাভা ইন্টারফেসে ডিফল্ট কীওয়ার্ড ব্যবহার করে ডিফল্ট বাস্তবায়ন সরবরাহ করতে পারেন
ওগেন

21

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

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

সারসংক্ষেপ

  1. একটি ইন্টারফেস এমন একটি চুক্তি সংজ্ঞা দেয় যা কিছু বাস্তবায়ন আপনার জন্য পূরণ করবে

  2. একটি বিমূর্ত শ্রেণি একটি ডিফল্ট আচরণ সরবরাহ করে যা আপনার প্রয়োগটি পুনরায় ব্যবহার করতে পারে।

উপরোক্ত এই দুটি বিষয় হ'ল আমি সাক্ষাত্কারের সময় যা খুঁজছি এবং এটি একটি কমপ্যাক্ট যথেষ্ট সংক্ষিপ্তসার। আরো বিস্তারিত জানার জন্য পড়ুন।

বিকল্প সারসংক্ষেপ

  1. একটি ইন্টারফেস হ'ল পাবলিক এপিআই সংজ্ঞায়িত করার জন্য
  2. একটি বিমূর্ত শ্রেণি অভ্যন্তরীণ ব্যবহারের জন্য, এবং এসপিআইগুলি সংজ্ঞায়িত করার জন্য

উদাহরণস্বরূপ

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

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

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

অন্য দৃষ্টিভঙ্গি: এসপিআই বনাম এপিআই s

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

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

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

কোনও এপিআই-তে পদ্ধতি যুক্ত করা সহজ, এপিআই-র সমস্ত বিদ্যমান ব্যবহারকারী এখনও সংকলন করবে। এসপিআইতে পদ্ধতি যুক্ত করা শক্ত, যেহেতু প্রতিটি পরিষেবা সরবরাহকারীকে (কংক্রিট বাস্তবায়ন) নতুন পদ্ধতিগুলি প্রয়োগ করতে হবে। ইন্টারফেসগুলি যদি এসপিআই সংজ্ঞায়িত করতে ব্যবহৃত হয়, যখনই এসপিআই চুক্তি পরিবর্তিত হয় কোনও সরবরাহকারীকে একটি নতুন সংস্করণ প্রকাশ করতে হবে। যদি এর পরিবর্তে অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করা হয়, তবে নতুন পদ্ধতিগুলি হয় বিদ্যমান বিমূর্ত পদ্ধতিগুলির ক্ষেত্রে বা খালি throw not implemented exceptionস্টাব হিসাবে সংজ্ঞায়িত করা যেতে পারে , যা কমপক্ষে কোনও পরিষেবা বাস্তবায়নের পুরানো সংস্করণটিকে এখনও সংকলন ও চালনার অনুমতি দেয়।

জাভা 8 এবং ডিফল্ট পদ্ধতিতে একটি নোট

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

"বইয়ের জ্ঞান"

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

এখানে একটি সাদৃশ্য রয়েছে: ধারণা করা প্রশ্নটি ছিল:

প্রম নাইট, গাড়ি বা হোটেলের ঘরে ভাড়া নেওয়া কী ভাল?

প্রযুক্তিগত উত্তরের মত শোনাচ্ছে:

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

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


আপনি কি "লো-কাপলিং" বলতে চাচ্ছেন?
ব্যবহারকারী 2418306

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

9

নিম্নলিখিত উপায়ে চিন্তা সম্পর্কে কি:

  • শ্রেণি এবং বিমূর্ত শ্রেণীর মধ্যে সম্পর্ক "হ'ল-এ" টাইপের হয়
  • শ্রেণি এবং একটি ইন্টারফেসের মধ্যে একটি সম্পর্ক "হ্যাঁ-এ" টাইপের হয়

সুতরাং যখন আপনার একটি বিমূর্ত শ্রেণি স্তন্যপায়ী প্রাণী, একটি সাবক্লাস হিউম্যান এবং একটি ইন্টারফেস ড্রাইভিং থাকে, তখন আপনি বলতে পারেন

  • প্রতিটি মানুষ একজন স্তন্যপায়ী
  • প্রতিটি মানুষের একটি ড্রাইভিং আছে (আচরণ)

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


9

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

package adventure;
import java.awt.*;
public interface Playable {
    public void playSound(String s);
    public Image loadPicture(String s);    
}

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

public class Adventure extends JFrame implements Playable

public class Dungeon3D extends SimpleApplication implements Playable

public class Main extends SimpleApplication implements AnimEventListener, ActionListener, Playable

সাধারণত, গেমওয়ার্ল্ডে, বিশ্বটি একটি বিমূর্ত শ্রেণি হতে পারে যা গেমটিতে পদ্ধতিগুলি সম্পাদন করে:

public abstract class World...

    public Playable owner;

    public Playable getOwner() {
        return owner;
    }

    public void setOwner(Playable owner) {
        this.owner = owner;
    }

6

অ্যাবস্ট্রাক্ট ক্লাসগুলি খাঁটি বিমূর্ততা নয় বিসিজেড এর কংক্রিটের সংগ্রহ (প্রয়োগকৃত পদ্ধতি) পাশাপাশি অ-বাস্তবায়ন পদ্ধতিগুলি। তবে ইন্টারফেসগুলি খাঁটি বিমূর্ত বিসিজেড রয়েছে কেবলমাত্র অ-বাস্তবায়ন পদ্ধতিগুলি কংক্রিট পদ্ধতি নয়।

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

  1. ব্যবহারকারী যদি সমস্ত বস্তুর জন্য সাধারণ কার্যকারিতা লিখতে চান।
  2. ভবিষ্যতে পুনরায় বাস্তবায়নের জন্য অ্যাবস্ট্রাক্ট ক্লাসগুলি সেরা পছন্দ যা শেষ ব্যবহারকারীর উপর প্রভাব না ফেলে আরও কার্যকারিতা যুক্ত করে।

ইন্টারফেস কেন?

  1. ব্যবহারকারী যদি আলাদা আলাদা কার্যকারিতা লিখতে চান তবে তা বস্তুগুলিতে ভিন্ন কার্যকারিতা হতে পারে।
  2. ইন্টারফেসগুলি সেরা পছন্দ যে ইন্টারফেস প্রকাশিত হওয়ার পরে যদি প্রয়োজনীয়তাগুলি পরিবর্তন করার প্রয়োজন হয় না।

5

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

একটি বিমূর্ত শ্রেণি একক লিঙ্গ প্রজাতির (*) মৃত পূর্বপুরুষের মতো: তাকে জীবিত করা যায় না তবে জীবিত (অর্থাৎ অ-বিমূর্ত ) বংশধর তার সমস্ত জিনকে উত্তরাধিকার সূত্রে পায়।

(*) এই রূপকটি প্রসারিত করতে, আসুন আমরা প্রজাতির সমস্ত সদস্য একই বয়সের জন্য বেঁচে থাকি বলি। এর অর্থ মৃত পূর্বপুরুষের সমস্ত পূর্বপুরুষদেরও অবশ্যই মৃত থাকতে হবে - একইভাবে জীবিত পূর্বপুরুষের সমস্ত বংশধরকে অবশ্যই জীবিত থাকতে হবে।


4

আমি কাজের জন্য সাক্ষাত্কার দিই এবং আপনার উত্তরটিও আমি প্রতিকূলভাবে দেখব (দুঃখিত তবে আমি খুব সৎ)। এটির মতো শোনাচ্ছে আপনি পার্থক্যটি সম্পর্কে পড়েছেন এবং একটি উত্তর সংশোধন করেছেন তবে সম্ভবত আপনি বাস্তবে এটি কখনও ব্যবহার করেন নি।

আপনি প্রতিটি কেন ব্যবহার করবেন সে সম্পর্কে একটি ভাল ব্যাখ্যা পার্থক্যটির একটি সুনির্দিষ্ট ব্যাখ্যা থাকার চেয়ে অনেক ভাল হতে পারে। নিয়োগকর্তারা আলটিমেটলি প্রগ্রেমারদের এমন জিনিসগুলি করতে চান যা একটি সাক্ষাত্কারে প্রদর্শিত কঠিন হতে পারে to প্রযুক্তিগত বা ডকুমেন্টেশন ভিত্তিক কাজের জন্য আবেদন করা তবে বিকাশকারীদের ভূমিকা না থাকলে আপনি যে উত্তরটি দিয়েছেন তা ভাল হবে।

ভবিষ্যতে সাক্ষাত্কারের সাথে শুভেচ্ছা।

এছাড়াও এই প্রশ্নের আমার উত্তরটি আপনার সরবরাহিত প্রযুক্তিগত উপাদানের চেয়ে সাক্ষাত্কারের কৌশল সম্পর্কে বেশি। সম্ভবত এটি সম্পর্কে পড়া বিবেচনা করুন। এই ধরণের জিনিসটির জন্য https://workplace.stackexchange.com/ একটি দুর্দান্ত জায়গা হতে পারে।


1
আপনি কি আমাকে উত্তর দিতে পারেন? এটা হতে পারে আমাকে সাহায্য করতে পারেন।
কোড_ফিশ

আপনাকে উত্তর দেওয়া অনেক কম প্রস্তাব দেয় তবে আপনাকে এটি কার্যকর করতে সহায়তা করে, মূলত আপনি কখন ব্যবহার করেন এবং প্রতিটি কেন আলাদা আলাদা কাজের জন্য উপযুক্ত তা ব্যাখ্যা করার একটি ব্যবহারিক উদাহরণ দিন।
অ্যাড্রিয়ান

4

একাধিক উত্তরাধিকারে ডায়মন্ড সমস্যা এড়াতে আপনি জাভাতে ইন্টারফেস চয়ন করেন ।

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

আপনি যদি ইতিমধ্যে সাধারণ বিষয়গুলি জানেন তবে আপনি বিমূর্ত শ্রেণি চয়ন করেন। উদাহরণস্বরূপ একটি বিমূর্ত ক্লাস নিন Car। উচ্চ স্তরে আপনি সাধারণ গাড়ি পদ্ধতিগুলি যেমন প্রয়োগ করেন calculateRPM()। এটি একটি সাধারণ পদ্ধতি এবং আপনি ক্লায়েন্টকে তার নিজের আচরণ
calculateMaxSpeed()ইত্যাদি বাস্তবায়িত করতে দিয়েছিলেন সম্ভবত আপনি নিজের কিছু দিনের বাস্তব অভিজ্ঞতা দিয়ে উদাহরণটি ব্যাখ্যা করে ব্যাখ্যা করতে পারতেন।


3

একটি ইন্টারফেস খাঁটি বিমূর্ত। ইন্টারফেসে আমাদের কোনও প্রয়োগের কোড নেই।

বিমূর্ত শ্রেণিতে দুটি পদ্ধতি এবং এর বাস্তবায়ন রয়েছে।

ইন্টারফেস এবং বিমূর্ত শ্রেণিতে টিউটোরিয়াল দেখতে এখানে ক্লিক করুন


3

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


3

এমনকি আমি একাধিক সাক্ষাত্কারেও একই প্রশ্নের মুখোমুখি হয়েছি এবং বিশ্বাস করি এটি সাক্ষাতকারকে বোঝাতে আপনার সময়কে দুর্বিষহ করে তোলে। আমি যদি উপরে থেকে সমস্ত উত্তর অন্তর্নিহিত করে থাকে তবে এটিকে আরও দৃinc়ভাবে বোঝাতে এবং তার সর্বোত্তমভাবে ওওকে কাজে লাগাতে আমাকে আরও একটি মূল পয়েন্ট যুক্ত করতে হবে

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

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

আমি মনে করি এটি সম্ভবত সাক্ষাত্কারকারকে কিছুটা হলেও বোঝাতে পারে ... হ্যাপি সাক্ষাত্কারগুলি সামনে।


2

আমি যখন ঘনিষ্ঠভাবে সম্পর্কিত 2 শ্রেণীর মধ্যে আচরণ ভাগ করে নেওয়ার চেষ্টা করছি তখন আমি একটি বিমূর্ত শ্রেণি তৈরি করি যা সাধারণ আচরণকে ধরে রাখে এবং উভয় শ্রেণির পিতামাতার হিসাবে কাজ করে।

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

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

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

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


2

ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে মূল পার্থক্য হ'ল ইন্টারফেস একাধিক উত্তরাধিকারকে সমর্থন করে তবে বিমূর্ত শ্রেণিটি নয়।

বিমূর্ত শ্রেণিতেও আপনি ইন্টারফেসের মতো সমস্ত বিমূর্ত পদ্ধতি সরবরাহ করতে পারেন।

কেন বিমূর্ত শ্রেণির প্রয়োজন?

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

ইন্টারফেস কেন প্রয়োজন?

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

  1. আপনার প্রয়োজনীয়তাগুলি কী তা সনাক্ত করুন এবং সেই প্রয়োজনীয়তার সাথে একটি চুক্তি করুন।
  2. তারপরে আপনার প্রকল্পটি নির্মাণের জন্য টেন্ডারগুলিকে কল করুন
  3. কে কখনও প্রকল্পটি নির্মাণ করে, এটি আপনার প্রয়োজনীয়তা পূরণ করে। তবে নির্মাণের যুক্তি এক বিক্রেতা থেকে অন্য বিক্রেতার চেয়ে আলাদা।

তারা কীভাবে যুক্তি তৈরি করেছিল তা আমি এখানে মাথা ঘামাই না। চূড়ান্ত বস্তুটি আমার প্রয়োজনীয়তাগুলি সন্তুষ্ট করেছে বা না, এটি কেবলমাত্র আমার মূল বিষয়।

এখানে আপনার প্রয়োজনীয়তাগুলিকে ইন্টারফেস এবং কনস্ট্রাক্টর বলা হয় বাস্তবায়নকারী called


2

কয়েকটি কথায়, আমি এইভাবে উত্তর দেব:

  • শ্রেণিবিন্যাসের মাধ্যমে উত্তরাধিকার রাষ্ট্রীয় উত্তরাধিকারকে বোঝায় ;
  • ইন্টারফেসের মাধ্যমে উত্তরাধিকার আচরণের উত্তরাধিকার হিসাবে দাঁড়িয়েছে ;

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

অবশ্যই, জাভা 8 টি থেকে শুরু করে কিছু পরিবর্তন হয়েছে তবে ধারণাটি এখনও একই।

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


1

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


1

বিমূর্ত শ্রেণিতে, আপনি পদ্ধতিগুলির ডিফল্ট বাস্তবায়ন লিখতে পারেন! ইন্টারফেসে আপনি পারবেন না। মূলত, ইন্টারফেসে বিশুদ্ধ ভার্চুয়াল পদ্ধতি রয়েছে যা শ্রেণি দ্বারা প্রয়োগ করা উচিত যা ইন্টারফেস প্রয়োগ করে।


1

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

"একটি ইন্টারফেস ক্লাসের মাধ্যমে একটি বিমূর্ত শ্রেণীর নির্বাচন করা আমাদের কোডটির ভবিষ্যত কী হবে তার উপর নির্ভর করে।

অ্যাবস্ট্রাক্ট ক্লাসগুলি আরও ভাল ফরোয়ার্ড-সামঞ্জস্যের অনুমতি দেয় কারণ আপনি আপনার বিদ্যমান কোডটি ভঙ্গ না করে ভবিষ্যতে ভালভাবে একটি অ্যাবস্ট্রাক্ট ক্লাসে আচরণ যুক্ত করতে পারেন -> এটি কোনও ইন্টারফেস ক্লাসের মাধ্যমে সম্ভব নয়।

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

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

আপনার পরবর্তী সাক্ষাত্কারে শুভকামনা!


1

আমি দুজনের মধ্যে পার্থক্য দেখাতে ব্যবহারিক দৃশ্যের সাহায্যে উত্তর দেওয়ার চেষ্টা করব।

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

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

এখন আপনি জিজ্ঞাসা করতে পারেন যদি রানবেল একটি বিমূর্ত শ্রেণি ছিল?

ভাল প্রযুক্তিগতভাবে এটি সম্ভব ছিল তবে নকশা অনুসারে নকশাগুলি হ'ল এটি একটি নিম্ন পছন্দ কারণ ছিল:

  • রান্নেবলের কোনও রাজ্যের সাথে সম্পর্কিত নয় এবং এটি রান () পদ্ধতির জন্য কোনও ডিফল্ট বাস্তবায়ন 'অফার' করে না
  • টাস্কটি এটিকে প্রসারিত করতে হবে যাতে এটি অন্য কোনও শ্রেণি বাড়াতে পারে না
  • টাস্কের রান্নেবল ক্লাসে বিশেষীকরণ হিসাবে দেওয়ার মতো কিছুই নেই, এটির দরকার কেবল রান () পদ্ধতিটিকে ওভাররাইড করা

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

কেবল আমাদের একটি ক্ষমতা (চুক্তি) সংজ্ঞায়িত করার জন্য ইন্টারফেস রাখুন, যখন এটির কঙ্কাল (সাধারণ / আংশিক) বাস্তবায়ন সংজ্ঞায়িত করতে একটি বিমূর্ত শ্রেণি ব্যবহার করুন।

দাবি অস্বীকার : নির্বোধ উদাহরণ অনুসরণ করে : বিচার করার চেষ্টা করবেন না :- পি

interface Forgiver {
    void forgive();
}

abstract class GodLike implements Forgiver {
    abstract void forget();
    final void forgive() {
        forget();
    }
}

এখন আপনাকে গডলাইক হিসাবে বেছে নেওয়া হয়েছে তবে আপনি কেবলমাত্র ক্ষমাকারী (যেমন গডলাইক নয়) হিসাবে বেছে নিতে পারেন এবং করুন:

class HumanLike implements Forgiver {
    void forgive() {
       // forgive but remember    
    }
}

অথবা আপনি গডলাইক হিসাবে বেছে নিতে পারেন এবং করতে পারেন:

class AngelLike extends GodLike {
    void forget() {
       // forget to forgive     
    }
}

দ্রষ্টব্য জাভা 8 ইন্টারফেসের সাথে আরো ইন্টারফেস এবং বিমূর্ত বর্গ আরও বেশি সংকীর্ণ হবে পার্থক্য B / W পাশাপাশি ডিফল্ট (overridable বাস্তবায়ন) পদ্ধতি স্ট্যাটিক এবং এইভাবে থাকতে পারে।


1

প্রায় সবকিছু এখানে ইতিমধ্যে আবৃত বলে মনে হচ্ছে .. abstractশ্রেণীর ব্যবহারিক প্রয়োগের জন্য আরও একটি বিষয় যুক্ত করা :

abstractকীওয়ার্ড এছাড়াও ব্যবহৃত হয় কেবল একটি ক্লাস তাত্ক্ষণিক হওয়া থেকে রোধ করে। আপনার যদি একটি কংক্রিট শ্রেণি থাকে যা আপনি তাত্ক্ষণিক হতে চান না - এটি তৈরি করুন abstract


1

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

আপনার উত্তর শেষ করার পরে আপনার উদাহরণটিতে ঝাঁপ দেওয়া উচিত:

সারাংশ:

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

public abstract class CTC {

    public int salary(int hra, int da, int extra)
    {
        int total;
        total = hra+da+extra;
        //incentive for specific performing employee
        //total = hra+da+extra+incentive;
        return total;
    }
}

class Manger extends CTC
{
}


class CEO extends CTC
{
}

class Developer extends CTC
{   
}

ইন্টারফেস

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

public interface EmployeType {

    public String typeOfEmployee();
}

class ContarctOne implements EmployeType
{

    @Override
    public String typeOfEmployee() {
        return "contract";
    }

}

class PermanentOne implements EmployeType
{

    @Override
    public String typeOfEmployee() {
        return "permanent";
    }

}

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


1

আমি যা বুঝি এবং কীভাবে আমি কাছে যাই তা থেকে,

ইন্টারফেস একটি স্পেসিফিকেশন / চুক্তির মতো, যে কোনও শ্রেণি একটি ইন্টারফেস ক্লাস প্রয়োগ করে বিমূর্ত শ্রেণিতে সংজ্ঞায়িত সমস্ত পদ্ধতি প্রয়োগ করতে হবে (ডিফল্ট পদ্ধতি বাদে (জাভা 8 তে প্রবর্তিত))

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

দ্রষ্টব্য: পদ্ধতিটি স্থিত বা ডিফল্ট না হলে আপনার ইন্টারফেস পদ্ধতিতে ফাংশন বডি থাকতে পারে না।


0

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

ইন্টারফেস - জাভা ইন্টারফেস নয়, তবে আরও সাধারণ শর্তে "ইন্টারফেস" - কোনও কোড মডিউলটির কাছে মূলত, ক্লায়েন্ট কোডের সাথে করা চুক্তি যা ইন্টারফেস ব্যবহার করে।

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

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

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


0

আপনার উত্তরটি সঠিক তবে সাক্ষাত্কারকারীর আপনার জাভা সম্পর্কিত বিবরণ অনুযায়ী সফ্টওয়্যার ইঞ্জিনিয়ারিং দৃষ্টিভঙ্গি অনুযায়ী পার্থক্য করা প্রয়োজন।

সহজ কথা:

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

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