জাভাতে বিমূর্ত শ্রেণি


273

জাভাতে "বিমূর্ত শ্রেণি" কী?


35
+1 এই প্রশ্নটি এত মৌলিক এবং মৌলিক, এটি এসও এর জন্য একটি সর্বোত্তম। আমি অবাক হয়েছি এখানে এর আগে এখানে জিজ্ঞাসা করা হয়নি।
যুবাল

6
ক্লিমেন্টের মন্তব্যের জন্য -1 (যদি আমি পারতাম); lmgtfy হয় না একটি সহায়ক উত্তর। কেন, যেমন পড়ুন যেমন এই মেটা.স্ট্যাকেক্সেঞ্জার.কম.কুইশনস
৫২৮০

26
@tuergeist। এটি Google এর কাছে সহজ হলে এটি অপ্রাসঙ্গিক, যতক্ষণ না এর আগে এসও তে জিজ্ঞাসা করা হয়নি। এছাড়াও, কে বলেন যে প্রোগ্রামিং ভাষার বিষয়ে প্রাথমিক প্রশ্নগুলি এসও এর অন্তর্ভুক্ত নয়?
জোনিক

12
এসও সম্পর্কে আমি একটি জিনিস পছন্দ করি তা হ'ল আপনি একটি উত্তর পেয়ে যা কনডেনড, ভাল রেখেছেন এবং বাকী ওয়েবে পাওয়া যায় এমন কোনও সাধারণ বিএস ছাড়াই বিন্দুতে ... ঠিক আছে, যাইহোক এরকম কিছু। প্রশ্নের জন্য +1!
অ্যান্ডার্স হ্যানসন

1
সুতরাং দীর্ঘ লেজ থাকার কথা নয়! জে এবং জে এমনকি পডকাস্ট 56 এর আশেপাশে এ সম্পর্কে কথা বলছেন ...
কুট্টচাক

উত্তর:


341

একটি বিমূর্ত শ্রেণি এমন একটি বর্গ যা তাত্ক্ষণিকভাবে চলতে পারে না। একটি বিমূর্ত বর্গ একটি inheriting উপশ্রেণী যে তৈরি করে ব্যবহার করা হয় করতে instantiated হবে না। উত্তরাধিকারী সাবক্লাসের জন্য একটি বিমূর্ত শ্রেণি কয়েকটি কাজ করে:

  1. উত্তরাধিকারী সাবক্লাস দ্বারা ব্যবহার করা যেতে পারে এমন পদ্ধতিগুলি নির্ধারণ করুন।
  2. অ্যাবস্ট্রাক্ট পদ্ধতিগুলি সংজ্ঞায়িত করুন যা উত্তরাধিকারসূত্রে সাবক্লাসটি প্রয়োগ করতে হবে।
  3. একটি সাধারণ ইন্টারফেস সরবরাহ করুন যা সাবক্লাসকে অন্য সমস্ত সাবক্লাসের সাথে বিনিময় করতে দেয়।

এখানে একটি উদাহরণ:

abstract public class AbstractClass
{
    abstract public void abstractMethod();
    public void implementedMethod() { System.out.print("implementedMethod()"); }
    final public void finalMethod() { System.out.print("finalMethod()"); }
}

লক্ষ্য করুন যে "অ্যাবস্ট্রাকথ মেথড ()" এর কোনও পদ্ধতির বডি নেই। এ কারণে আপনি নিম্নলিখিতটি করতে পারবেন না:

public class ImplementingClass extends AbstractClass
{
    // ERROR!
}

কার্যকর করার মতো কোনও পদ্ধতি নেই abstractMethod()! সুতরাং জেভিএমের পক্ষে এটির মতো উপায় পাওয়ার কোনও উপায় নেই যখন এটির মতো কিছু আসে তখন এটি করার কথাnew ImplementingClass().abstractMethod()

এখানে একটি সঠিক ImplementingClass

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
}

লক্ষ্য করুন যে আপনাকে সংজ্ঞায়িত করতে হবে না implementedMethod()বা finalMethod()। তারা ইতিমধ্যে দ্বারা সংজ্ঞায়িত করা হয়েছিলAbstractClass

এখানে অন্য একটি সঠিক ImplementingClass

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
    public void implementedMethod() { System.out.print("Overridden!"); }
}

এই ক্ষেত্রে, আপনি ওভাররাইড করেছেন implementedMethod()

তবে মূলশব্দটির কারণে finalনিম্নলিখিতটি সম্ভব নয়।

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
    public void implementedMethod() { System.out.print("Overridden!"); }
    public void finalMethod() { System.out.print("ERROR!"); }
}

কারণ বাস্তবায়ন আপনি এই ব্যবহার করতে পারবেন না finalMethod()AbstractClassচূড়ান্ত বাস্তবায়ন হিসাবে চিহ্নিত আছেfinalMethod() কি কখনো অন্য কোন বাস্তবায়নের অনুমতি দেওয়া হবে:।

এখন আপনি করতে পারেন এছাড়াও দুইবার একটি বিমূর্ত বর্গ বাস্তবায়ন:

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
    public void implementedMethod() { System.out.print("Overridden!"); }
}

// In a separate file.
public class SecondImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("second abstractMethod()"); }
}

এখন কোথাও আপনি অন্য পদ্ধতি লিখতে পারে।

public tryItOut()
{
    ImplementingClass a = new ImplementingClass();
    AbstractClass b = new ImplementingClass();

    a.abstractMethod();    // prints "abstractMethod()"
    a.implementedMethod(); // prints "Overridden!"     <-- same
    a.finalMethod();       // prints "finalMethod()"

    b.abstractMethod();    // prints "abstractMethod()"
    b.implementedMethod(); // prints "Overridden!"     <-- same
    b.finalMethod();       // prints "finalMethod()"

    SecondImplementingClass c = new SecondImplementingClass();
    AbstractClass d = new SecondImplementingClass();

    c.abstractMethod();    // prints "second abstractMethod()"
    c.implementedMethod(); // prints "implementedMethod()"
    c.finalMethod();       // prints "finalMethod()"

    d.abstractMethod();    // prints "second abstractMethod()"
    d.implementedMethod(); // prints "implementedMethod()"
    d.finalMethod();       // prints "finalMethod()"
}

লক্ষ্য করুন যে আমরা bকোনও AbstractClassপ্রকারের ঘোষণা দিলেও এটি প্রদর্শিত হয় "Overriden!"। এটি কারণ আমরা অবজেক্টটি অবজেক্টটি আসলে একটি ছিল ImplementingClass, যারimplementedMethod() অবশ্যই ওভাররাইড করা হয়। (আপনি এটিকে বহুবিজ্ঞান হিসাবে উল্লেখ করেছেন seen

আমরা যদি কোনও নির্দিষ্ট সাবক্লাসের জন্য নির্দিষ্ট কোনও সদস্য অ্যাক্সেস করতে চাই তবে আমাদের অবশ্যই প্রথমে সেই সাবক্লাসে নামিয়ে দিতে হবে:

// Say ImplementingClass also contains uniqueMethod()
// To access it, we use a cast to tell the runtime which type the object is
AbstractClass b = new ImplementingClass();
((ImplementingClass)b).uniqueMethod();

শেষ অবধি, আপনি নিম্নলিখিতগুলি করতে পারবেন না:

public class ImplementingClass extends AbstractClass, SomeOtherAbstractClass
{
    ... // implementation
}

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

public class ImplementingClass extends AbstractClass implements InterfaceA, InterfaceB
{
    ... // implementation
}

এখানে একটি উদাহরণ ইন্টারফেস:

interface InterfaceA
{
    void interfaceMethod();
}

এটি মূলত:

abstract public class InterfaceA
{
    abstract public void interfaceMethod();
}

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

নিম্নলিখিতটি অবৈধ:

interface InterfaceB
{
    void interfaceMethod() { System.out.print("ERROR!"); }
}

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


5
সি.আইপ্লিমেন্টেড মেথোড () বিবৃতিটির ভুল বর্ণনার জন্য @ ইমাজিস্ট -1; // প্রিন্টস "প্রয়োগকৃত মেঠোড ()", এটি "ওভাররিডেন!" সর্বদা
শচীন কুমার

2
@ সাচিন আমি কেন এটি "প্রয়োগকৃত মেঠোড ()" মুদ্রণ করবে তা বুঝতে আধঘণ্টা টায়ারিং নষ্ট করেছিলাম এবং তারপরে আমি আপনার মন্তব্যটি দেখেছি। জাভা দিয়ে কিছু পরিবর্তন হয়েছে বা অন্যরা কি ভুলটিকে উপেক্ষা করেছে?
রাউনাক

@ সচিনকুমার লেখকের প্রতিক্রিয়া না থাকার কারণে আমি এই ত্রুটিটি সমাধান করার চেষ্টা করেছি। CMIIW।
মতিন উলহাক

@ সচিনকুমার আমি এখানে খেলায় কিছুটা দেরি করেছি, তবে আপনি কি বলবেন যে সি ++ শিরোলেখ ফাইলটিতে কোনও পদ্ধতি ঘোষণার (তবে বাস্তবায়ন হয়নি) একটি ভাল উপমা হবে?
শোয়েটজ

5
@ সচিনকুমার c.implementedMethod()" ওভারডেন !" ছাপবেন কেন ? SecondImplementingClassওভাররাইড নেই implementedMethod()
জন রেড

75

একটি জাভা ক্লাস নিম্নলিখিত শর্তাবলী বিমূর্ত হয়ে যায়:

কমপক্ষে একটি পদ্ধতির বিমূর্ত হিসাবে চিহ্নিত করা হয়েছে:

public abstract void myMethod()

সেক্ষেত্রে সংকলক আপনাকে পুরো ক্লাসটিকে বিমূর্ত হিসাবে চিহ্নিত করতে বাধ্য করে।

ক্লাসটি বিমূর্ত হিসাবে চিহ্নিত করা হয়েছে:

abstract class MyClass

যেমন ইতিমধ্যে বলেছে: আপনার যদি বিমূর্ত পদ্ধতি থাকে তবে সংকলক আপনাকে পুরো শ্রেণিকে বিমূর্ত হিসাবে চিহ্নিত করতে বাধ্য করে। তবে আপনার কোনও বিমূর্ত পদ্ধতি না থাকলেও আপনি ক্লাসটিকে বিমূর্ত হিসাবে চিহ্নিত করতে পারেন।

সাধারন ব্যবহার:

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

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


1
নিতপিক: দ্বিতীয় 'শর্ত' অপ্রয়োজনীয়, যেহেতু আপনি কেবল ক্লাসে একটি বিমূর্ত পদ্ধতি ঘোষণা করতে পারেন যা স্পষ্টভাবে বিমূর্ত হিসাবে ঘোষণা করা হয়।
স্টিফেন সি

2
সম্মত হন, পরামর্শটি সত্যই সঠিক নয়, বা ভালভাবে লেখা আছে, এটি কেবল দুর্দান্তভাবে ফর্ম্যাট করা হয়েছে।
দুপুর সিল্ক

তবে আপনার 'ক্লাস কংক্রিট তৈরি করার' পরামর্শটিও ভুল বলা হয়েছে। আপনি ক্লাস কংক্রিট তৈরি করেন না , এটি হয় হয়, না হয় নির্ভর করে এটি বিমূর্ত কিনা বা না।
দুপুর সিল্ক

1
এটি কেবল সাধারণ ভুল। একটি বিমূর্ত শ্রেণীর কোনও বিমূর্ত পদ্ধতি থাকতে হবে না। আপনি কোনও পদ্ধতি ছাড়াই বা কেবল কংক্রিটের পদ্ধতি ছাড়াই একটি বিমূর্ত শ্রেণি তৈরি করতে পারেন।
উয়র্ন

1
গেমটি থেকে 10 বছর দেরি হলেও এটি সবচেয়ে সুনির্দিষ্ট উত্তর। @ জনের আপনি যে উত্তরটি আমার মনে হয় তাতে বিভ্রান্ত হন। আমি নিশ্চিত যে এটি বোঝানো হয়েছে যে abstractক্লাসের বিমূর্ত হওয়ার জন্য কীওয়ার্ডটি প্রয়োজনীয়। কিন্তু একটি কংক্রিট শ্রেণিতে কোনও পদ্ধতি থাকতে পারে না । সুতরাং আপনার ক্লাসে যদি কোনও পদ্ধতি থাকে তবে এটি সংকলকটির ক্লাস হিসাবে ঘোষণা করতে হবে । abstract abstractabstract
রাকিব

24

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

বিমূর্ত শ্রেণীর প্রধান জিনিস

  • একটি বিমূর্ত শ্রেণিতে বিমূর্ত পদ্ধতি থাকতে পারে বা নাও থাকতে পারে hereএখানে বিমূর্ত বিহীন পদ্ধতি থাকতে পারে।

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

    প্রাক্তন: abstract void moveTo(double deltaX, double deltaY);

  • কোনও শ্রেণীর যদি কমপক্ষে একটি বিমূর্ত পদ্ধতি থাকে তবে সেই শ্রেণিটি অবশ্যই বিমূর্ত হতে হবে

  • অ্যাবস্ট্রাক্ট ক্লাসগুলি তাত্ক্ষণিকভাবে চালু করা যাবে না (আপনাকে বিমূর্ত শ্রেণীর অবজেক্ট তৈরি করার অনুমতি নেই)

  • একটি বিমূর্ত শ্রেণি ব্যবহার করতে, আপনাকে এটি অন্য শ্রেণীর কাছ থেকে উত্তরাধিকারী হতে হবে। এটিতে সমস্ত বিমূর্ত পদ্ধতিতে প্রয়োগকরণ সরবরাহ করুন।

  • আপনি যদি একটি বিমূর্ত শ্রেণীর উত্তরাধিকারী হন তবে আপনাকে এটিতে সমস্ত বিমূর্ত পদ্ধতিতে প্রয়োগকরণ সরবরাহ করতে হবে।

বিমূর্ত শ্রেণিabstract ঘোষণা করুন ঘোষণার সময় শ্রেণীর আগে কীওয়ার্ড নির্দিষ্টকরণ এটিকে বিমূর্ত করে তোলে। নীচের কোডটি দেখুন:

abstract class AbstractDemo{ }

বিমূর্ত পদ্ধতিabstract ঘোষণা করুন ঘোষণার সময় পদ্ধতির আগে কীওয়ার্ড নির্দিষ্টকরণ এটিকে বিমূর্ত করে তোলে। নীচের কোডটি দেখুন,

abstract void moveTo();//no body

কেন আমাদের বিমূর্ত ক্লাস করা দরকার

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

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

প্রথমে, আপনি একটি বিমূর্ত ক্লাস ঘোষণা করেন GraphicObject, সদস্য ভেরিয়েবল এবং পদ্ধতিগুলি যে সমস্ত সাবক্লাস দ্বারা সম্পূর্ণরূপে বর্তমানের অবস্থান এবং মুভটো পদ্ধতিতে ভাগ করে নেওয়া হয় provide GraphicObjectঅঙ্কিত বা পুনরায় আকার দেওয়ার মতো বিমূর্ত পদ্ধতিও ঘোষণা করা হয়েছে যেগুলি সমস্ত উপশ্রেণী দ্বারা বাস্তবায়িত হওয়া দরকার তবে বিভিন্ন উপায়ে প্রয়োগ করতে হবে। GraphicObjectবর্গ ভালো কিছু সন্ধান করতে পারেন:

abstract class GraphicObject {

  void moveTo(int x, int y) {
    // Inside this method we have to change the position of the graphic 
    // object according to x,y     
    // This is the same in every GraphicObject. Then we can implement here. 
  }

  abstract void draw(); // But every GraphicObject drawing case is 
                        // unique, not common. Then we have to create that 
                        // case inside each class. Then create these    
                        // methods as abstract 
  abstract void resize();
}

সাব ক্লাসে বিমূর্ত পদ্ধতি ব্যবহারের প্রতিটি নন অ্যাবস্ট্রাক্ট সাবক্লাস GraphicObjectযেমন Circleএবং এর Rectangleঅবশ্যই প্রয়োগ drawএবং resizeপদ্ধতিগুলির জন্য বাস্তবায়ন সরবরাহ করতে হবে ।

class Circle extends GraphicObject {
  void draw() {
    //Add to some implementation here
  }
  void resize() {
    //Add to some implementation here   
  }
}
class Rectangle extends GraphicObject {
  void draw() {
    //Add to some implementation here
  }
  void resize() {
    //Add to some implementation here
  }
}

mainপদ্ধতির অভ্যন্তরে আপনি এইভাবে সমস্ত পদ্ধতিতে কল করতে পারেন:

public static void main(String args[]){
   GraphicObject c = new Circle();
   c.draw();
   c.resize();
   c.moveTo(4,5);   
}

জাভাতে বিমূর্ততা অর্জনের উপায়

জাভাতে বিমূর্ততা অর্জনের দুটি উপায় রয়েছে

  • বিমূর্ত শ্রেণি (0 থেকে 100%)
  • ইন্টারফেস (100%)

কনস্ট্রাক্টর, ডেটা সদস্য, পদ্ধতি, ইত্যাদি সহ বিমূর্ত শ্রেণি Ab

abstract class GraphicObject {

  GraphicObject (){
    System.out.println("GraphicObject  is created");
  }
  void moveTo(int y, int x) {
       System.out.println("Change position according to "+ x+ " and " + y);
  }
  abstract void draw();
}

class Circle extends GraphicObject {
  void draw() {
    System.out.println("Draw the Circle");
  }
}

class TestAbstract {  
 public static void main(String args[]){

   GraphicObject  grObj = new Circle ();
   grObj.draw();
   grObj.moveTo(4,6);
 }
}

আউটপুট:

GraphicObject  is created
Draw the Circle
Change position according to 6 and 4

দুটি নিয়ম মনে রাখবেন:

  • যদি শ্রেণিতে কয়েকটি বিমূর্ত পদ্ধতি এবং কয়েকটি কংক্রিট পদ্ধতি থাকে তবে এটিকে একটি abstractশ্রেণী হিসাবে ঘোষণা করুন ।

  • শ্রেণীর যদি কেবল বিমূর্ত পদ্ধতি থাকে তবে এটি হিসাবে ঘোষণা করুন interface

তথ্যসূত্র:


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

দুটি নিয়ম এটিকে ছেড়ে দেয়
LiNKeR

4

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


3

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

আপনি কোনও ইন্টারফেস ইনস্ট্যান্ট করতে পারবেন না, এটি একটি বিমূর্ত শ্রেণীর জন্যও রয়েছে।

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

public abstract class MyAbstractClass{
  public abstract void DoSomething();
}

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

উদাহরণ:

public abstract class MyAbstractClass{

  public int CalculateCost(int amount){
     //do some default calculations
     //this can be overriden by subclasses if needed
  }

  //this MUST be implemented by subclasses
  public abstract void DoSomething();
}

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

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

3

ওরাকল ডকুমেন্টেশন থেকে

বিমূর্ত পদ্ধতি এবং শ্রেণি:

একটি বিমূর্ত শ্রেণি একটি শ্রেণি যা বিমূর্ত ঘোষণা করা হয় - এটি বিমূর্ত পদ্ধতি অন্তর্ভুক্ত বা নাও থাকতে পারে

বিমূর্ত শ্রেণিগুলি তাত্ক্ষণিকভাবে চালু করা যায় না, তবে সেগুলি সাবক্ল্যাস করা যেতে পারে

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

abstract void moveTo(double deltaX, double deltaY);

যদি কোনও শ্রেণিতে বিমূর্ত পদ্ধতি অন্তর্ভুক্ত থাকে তবে ক্লাসটি নিজেই বিমূর্ত হিসাবে ঘোষণা করতে হবে:

public abstract class GraphicObject {
   // declare fields
   // declare nonabstract methods
   abstract void draw();
}

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

যেহেতু abstract classesএবং interfacesসম্পর্কিত, নীচে এসই প্রশ্নগুলি দেখুন:

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

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


3

আপনার উত্তরগুলি এখানে পান:

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

একটি বিমূর্ত শ্রেণীর একটি চূড়ান্ত পদ্ধতি থাকতে পারে?

বিটিডব্লিউ - আপনি সম্প্রতি জিজ্ঞাসা করা প্রশ্নগুলি। খ্যাতি বাড়াতে নতুন প্রশ্ন সম্পর্কে চিন্তা করুন ...

সম্পাদনা:

ঠিক বুঝতে পেরেছি যে এর পোস্টারগুলি এবং রেফারেন্সযুক্ত প্রশ্নের একই বা কমপক্ষে একই রকম নাম রয়েছে তবে ব্যবহারকারী-আইডি সর্বদা আলাদা is সুতরাং, কোনও প্রযুক্তিগত সমস্যা আছে, সেই কিউরের আবার লগইন করতে এবং তার প্রশ্নের উত্তরগুলি খুঁজে পেতে সমস্যা আছে বা এটি সম্প্রদায়কে বিনোদন দেওয়ার জন্য এটি এক ধরণের গেম;)


আর সে কারণেই আমি 'সম্প্রদায় উইকি' পরীক্ষা করেছিলাম - এই প্রশ্নগুলির প্রতিক্রিয়া দেখিয়ে কাউকে খ্যাতি বাড়াতে হবে না;)
আন্ড্রেয়াস ডলক

1

এই সমস্ত পোস্টে সামান্য সংযোজন।

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


1

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

abstract class Foo {
    abstract void someMethod();
}

বা পরোক্ষভাবে

interface IFoo {
    void someMethod();
}

abstract class Foo2 implements IFoo {
}

তবে কোনও শ্রেণি বিমূর্ত পদ্ধতি না রেখে বিমূর্ত হতে পারে। এটি সরাসরি তাত্ক্ষণিকতা প্রতিরোধের একটি উপায়, যেমন

abstract class Foo3 {
}

class Bar extends Foo3 {

}

Foo3 myVar = new Foo3(); // illegal! class is abstract
Foo3 myVar = new Bar(); // allowed!

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

আর একটি ঘন ঘন প্যাটার্নটি হ'ল বিমূর্ত শ্রেণিতে মূল কার্যকারিতা বাস্তবায়ন এবং বর্ধিত শ্রেণীর দ্বারা প্রয়োগ করা যেতে পারে এমন একটি বিমূর্ত পদ্ধতিতে অ্যালগরিদমের অংশটি সংজ্ঞায়িত করা। বোকা উদাহরণ:

abstract class Processor {
    protected abstract int[] filterInput(int[] unfiltered);

    public int process(int[] values) {
        int[] filtered = filterInput(values);
        // do something with filtered input
    }
}

class EvenValues extends Processor {
    protected int[] filterInput(int[] unfiltered) {
        // remove odd numbers
    }
}

class OddValues extends Processor {
    protected int[] filterInput(int[] unfiltered) {
        // remove even numbers
    }
}

1

সমাধান - বেস ক্লাস (বিমূর্ত)

public abstract class Place {

String Name;
String Postcode;
String County;
String Area;

Place () {

        }

public static Place make(String Incoming) {
        if (Incoming.length() < 61) return (null);

        String Name = (Incoming.substring(4,26)).trim();
        String County = (Incoming.substring(27,48)).trim();
        String Postcode = (Incoming.substring(48,61)).trim();
        String Area = (Incoming.substring(61)).trim();

        Place created;
        if (Name.equalsIgnoreCase(Area)) {
                created = new Area(Area,County,Postcode);
        } else {
                created = new District(Name,County,Postcode,Area);
        }
        return (created);
        }

public String getName() {
        return (Name);
        }

public String getPostcode() {
        return (Postcode);
        }

public String getCounty() {
        return (County);
        }

public abstract String getArea();

}

1
কোড হিসাবে সমস্ত কোড ফর্ম্যাট করার চেষ্টা করুন, এবং দয়া করে কিছু ব্যাখ্যা যোগ করুন, এখনই এটি খুব কমই একটি উত্তর হিসাবে বিবেচনা করা যেতে পারে।
NomeN

3
যতক্ষণ না আপনি নিজের কোডটির ব্যাখ্যা না দিয়ে থাকেন। আপনি একটি খারাপ উত্তর নির্মাতা হিসাবে বিবেচিত হবে। সুতরাং দয়া করে এখানে ব্যাখ্যা দিন
devsda

0

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

অন্য কথায়, একটি শ্রেণি যা বিমূর্ত কীওয়ার্ড সহ ঘোষিত হয়, এটি জাভাতে অ্যাবস্ট্রাক্ট শ্রেণি হিসাবে পরিচিত। এটি বিমূর্ত (শরীর ছাড়া পদ্ধতি) এবং অ-বিমূর্ত পদ্ধতি (শরীরের সাথে পদ্ধতি) থাকতে পারে।

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

abstract class Bike{  
  abstract void run();  
}  

class Honda4 extends Bike{  
    void run(){
        System.out.println("running safely..");
    }  

    public static void main(String args[]){  
       Bike obj = new Honda4();  
       obj.run();  
    }  
} 

0

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


0

বর্গ যা কংক্রিট এবং নন-কংক্রিট উভয় পদ্ধতি থাকতে পারে, যেমন শরীরের সাথে এবং ছাড়াও।

  1. বাস্তবায়ন ব্যতীত পদ্ধতিতে অবশ্যই 'বিমূর্ত' কীওয়ার্ড থাকা উচিত।
  2. বিমূর্ত শ্রেণি তাত্ক্ষণিকভাবে চালু করা যায় না।

-1

এটি কিছুই করে না, কেবল একটি সাধারণ টেম্পলেট সরবরাহ করুন যা এর সাবক্লাসের জন্য ভাগ করা হবে

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