CodeGym /Java Blog /এলোমেলো /জাভা বিমূর্ত পদ্ধতি এবং ক্লাস
John Squirrels
লেভেল 41
San Francisco

জাভা বিমূর্ত পদ্ধতি এবং ক্লাস

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

একটি বিমূর্ত পদ্ধতি কি?

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

public abstract int example(int a1, int a2);
আপনি যখন এই পদ্ধতিটি দেখেন, আপনি বলতে পারেন যে এটি একটি পূর্ণসংখ্যা প্রদান করে এবং এটি তার যুক্তি হিসাবে দুটি পূর্ণসংখ্যা গ্রহণ করে। আপনি কি বলতে পারবেন না যে এই পদ্ধতিটি কিভাবে প্রয়োগ করা হয়। কারণ এটি বাস্তবায়ন করতে, আপনাকে এটিকে ওভাররাইড করতে হবে। জাভাতে একটি বিমূর্ত পদ্ধতি তৈরি করার সময়, আপনাকে কয়েকটি নির্দেশিকা মেনে চলতে হবে বা আপনার প্রোগ্রাম সঠিকভাবে কম্পাইল করবে না। মনে রাখবেন:
  • জাভা বিমূর্ত পদ্ধতির কোন বাস্তবায়ন নেই। অর্থাৎ, তাদের কখনই কোঁকড়া ধনুর্বন্ধনী এবং এমন একটি বডি অনুসরণ করা উচিত নয় যা বলে যে পদ্ধতিটি কীভাবে ব্যবহার করা হবে। এটি একটি সেমিকোলন দিয়ে শেষ হয়েছে।

  • আপনি যদি একটি বিমূর্ত পদ্ধতি তৈরি করেন তবে এটি শুধুমাত্র একটি বিমূর্ত শ্রেণীতে রাখা যেতে পারে। অর্থাৎ, আপনার একটি কংক্রিট ক্লাস থাকতে পারে না যার ভিতরে একটি বিমূর্ত পদ্ধতি রয়েছে।
    i একটি পার্শ্ব নোট হিসাবে, আপনার যদি একটি বিমূর্ত শ্রেণী থাকে তবে এতে কনস্ট্রাক্টর থাকতে পারে। তবে এটির একটি বিমূর্ত পদ্ধতি থাকতে হবে না।

  • যখন একটি কংক্রিট শ্রেণী একটি বিমূর্ত শ্রেণী প্রসারিত করে, তখন এটিকে অবশ্যই অভিভাবক শ্রেণীর সমস্ত বিমূর্ত পদ্ধতি প্রয়োগ করতে হবে বা এটি কংক্রিট হতে পারে না এবং বিমূর্ত ঘোষণা করতে হবে।

এই শেষ দুটি একটু বিভ্রান্তিকর হতে পারে, তাই এখনই এটি পরিষ্কার করা যাক।

বিমূর্ত জাভা ক্লাস প্রসারিত করা

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

abstract class Shape {
  		String shapeName = " ";
  		Shape(String name) { 
    			this.shapeName = name; 
  		} 

abstract double area();
  		abstract double perimeter();
}
এখন, যদি আমরা আসলে এই বিমূর্ত পদ্ধতিগুলি ব্যবহার করতে চাই, আমাদেরকে বিমূর্ত জাভা প্যারেন্ট ক্লাস শেপ প্রসারিত করতে হবে এবং তারপর পদ্ধতিগুলিকে ইনস্ট্যান্টিয়েট করতে হবে। তাই প্রতিটি কংক্রিট ক্লাস অবশ্যই এলাকা এবং পরিধি বিমূর্ত পদ্ধতি বাস্তবায়ন করবে।

class Quadrilateral extends Shape  
{ 
    double length, width; 
      
    Quadrilateral(double l, double w, String name) 
    { 
        super(name); 
        this.length = l; 
        this.width = w; 
    } 
      
    @Override
    public double perimeter()  
    { 
        return ((2*length)+(2*width));
    } 
      
    @Override
    public double area()  
    { 
        return (length*width); 
    } 
}

Implementing the Quadrilateral class would then look like this
class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4, "Rectangle"); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
} 
কনসোল থেকে আউটপুট তারপর এই মত দেখায়:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
মনে রাখবেন যে ক্লাস চতুর্ভুজকে প্যারেন্ট ক্লাস Shape থেকে Shape(স্ট্রিং নাম) কনস্ট্রাক্টরকে ইনস্ট্যান্টিয়েট করতে হবে না । কারণ এটি একটি বিমূর্ত পদ্ধতি নয়। যাইহোক, যদি আপনি শুধুমাত্র একটি শ্রেণীতে একটি এলাকা বা পরিধি প্রয়োগ করেন, তাহলে নতুন ক্লাসটি বিমূর্ত হতে হবে কারণ এতে উভয়ই অন্তর্ভুক্ত ছিল না। আপনি ইন্টারফেসে বিমূর্ত পদ্ধতি ব্যবহার করতে পারেন।

ইন্টারফেস সহ বিমূর্ত জাভা পদ্ধতি

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

interface Shape {

  abstract double area();
  abstract double perimeter();
}


So the Quadrilateral class would then look like this:
class Quadrilateral implements Shape {  

  double length, width; 
      
    	  Quadrilateral(double l, double w) {
    
    	    this.length = l; 
    	    this.width = w; 
    	  } 
      
    	  @Override
    	  public double perimeter() {
     
    	    return ((2*length)+(2*width));
    	  } 
      
    	  @Override
    	  public double area() {
    
   	    return (length*width); 
    	  } 
}
অবশেষে, নতুন চতুর্ভুজ ব্যবহার করে এটি আকৃতি ইন্টারফেস প্রয়োগ করে অনেকটা একই হবে:

class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
}
এবং কনসোল প্রিন্ট আউট এই মত দেখাবে:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
আপনি যদি ইন্টারফেস এবং বিমূর্ত ক্লাসের মধ্যে পার্থক্য সম্পর্কে আরও অন্বেষণ করতে চান তবে আপনি এখানে আরও তথ্য পেতে পারেন।

কিন্তু কেন অ্যাবস্ট্রাক্ট জাভা পদ্ধতি ব্যবহার করবেন?

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

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

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

মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION