আমরা কি একটি বিমূর্ত ক্লাস ইনস্ট্যান্ট করতে পারি?


573

আমার একটি সাক্ষাত্কারের সময় আমাকে জিজ্ঞাসা করা হয়েছিল "আমরা যদি কোনও বিমূর্ত ক্লাসটি ইনস্ট্যান্ট করতে পারি?"

আমার উত্তর ছিল "না আমরা পারব না"। তবে, সাক্ষাত্কারকারী আমাকে বলেছিলেন "ভুল, আমরা পারি" "

আমি এ নিয়ে কিছুটা তর্ক করেছি। তারপরে তিনি আমাকে বাড়িতে এ চেষ্টা করার জন্য বলেছিলেন।

abstract class my {
    public void mymethod() {
        System.out.print("Abstract");
    }
}

class poly {
    public static void main(String a[]) {
        my m = new my() {};
        m.mymethod();
    }
}

এখানে আমি আমার ক্লাসের উদাহরণ তৈরি করছি এবং বিমূর্ত শ্রেণির কলিং পদ্ধতি method কেউ দয়া করে আমাকে এই ব্যাখ্যা করতে পারেন? আমি আমার সাক্ষাত্কারের সময় সত্যিই ভুল ছিল?


2
যদিও শুধুমাত্র সামান্য সাথে সম্পর্কিত, এক সম্ভবত C ++ একটি বিমূর্ত বর্গ instantiate করতে পারেন: আপনি একটি অ বিমূর্ত বর্গ আহরণ Bএকটি বিমূর্ত এক থেকে A, নির্মাণ অংশ সময় এর Bদৃষ্টান্ত, যা চলমান গঠিত A'র কন্সট্রাকটর, বস্তুর রানটাইম টাইপ আসলে A। শুধুমাত্র অস্থায়ী।
ভ্লাদ

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

3
অথবা সাক্ষাত্কারকারক তিনি যা প্রস্তাব করেছিলেন তার বিরুদ্ধে আপনার বক্তব্য সম্পর্কে আপনি কতটা আত্মবিশ্বাসী তা খতিয়ে দেখতে চেয়েছিলেন!
সিড

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

2
এটি কোন কুইজ শো নয়, তবে একটি কাজের সাক্ষাত্কার, তাই না? তাহলে জাভা, বা সি ++ যদি বিমূর্ত ক্লাস ইনস্ট্যান্ট করার অনুমতি দেয়? আপনি এটি করবেন না, কারণ এটি করা কোনও চালাক জিনিস নয়। উদ্দেশ্য-সিতে, বিমূর্ত ক্লাসগুলি কেবল কনভেনশন দ্বারা বিমূর্ত হয় এবং সেগুলি ইনস্ট্যান্ট করা একটি বাগ ating
gnasher729

উত্তর:


722

এখানে, আমি আমার ক্লাসের উদাহরণ তৈরি করছি

না, আপনি এখানে আপনার বিমূর্ত শ্রেণির উদাহরণ তৈরি করছেন না। বরং আপনি আপনার বিমূর্ত শ্রেণীর বেনামে সাবক্লাসের উদাহরণ তৈরি করছেন । এবং তারপরে আপনি সাবস্ট্রাক্স অবজেক্টের দিকে নির্দেশ করে আপনার বিমূর্ত শ্রেণির রেফারেন্সে পদ্ধতিটি চালু করছেন ।

এই আচরণটি পরিষ্কারভাবে জেএলএসে তালিকাভুক্ত - বিভাগ # 15.9.1 : -

যদি শ্রেণীর উদাহরণ তৈরির এক্সপ্রেশনটি কোনও শ্রেণীর শৃঙ্গে শেষ হয়, তবে ক্লাসটি ইনস্ট্যান্ট করা হচ্ছে বেনাম শ্রেণি। তারপর:

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

জোর আমার।

এছাড়াও, জেএলএস - বিভাগ # 12.5 এ , আপনি অবজেক্ট তৈরি প্রক্রিয়া সম্পর্কে পড়তে পারেন । আমি এখান থেকে একটি বিবৃতি উদ্ধৃত করব: -

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

ফলস্বরূপ সদ্য নির্মিত বস্তুর একটি রেফারেন্স ফিরে আসার ঠিক আগে, নির্দেশিত কন্সট্রাক্টর নিম্নলিখিত প্রক্রিয়াটি ব্যবহার করে নতুন অবজেক্টটি আরম্ভ করার জন্য প্রক্রিয়া করা হয়:

আমার দেওয়া লিঙ্কটিতে আপনি সম্পূর্ণ প্রক্রিয়া সম্পর্কে পড়তে পারেন।


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

My.java:

abstract class My {
    public void myMethod() {
        System.out.print("Abstract");
    }
}

Poly.java:

class Poly extends My {
    public static void main(String a[]) {
        My m = new My() {};
        m.myMethod();
    }
}

এখন, আপনার উত্স ফাইল দুটি সংকলন করুন:

javac My.java Poly.java

এখন আপনি যে ডিরেক্টরিটিতে উত্স কোডটি সংকলন করেছেন সেখানে আপনি নীচের ক্লাসের ফাইলগুলি দেখতে পাবেন:

My.class
Poly$1.class  // Class file corresponding to anonymous subclass
Poly.class

যে ক্লাস দেখুন - Poly$1.class। এটি নীচের কোডটি ব্যবহার করে তাত্পর্যপূর্ণ বেনামে সাবক্লাসের সাথে সংকলকটির দ্বারা তৈরি ক্লাস ফাইল:

new My() {};

সুতরাং, এটি স্পষ্ট যে এখানে একটি পৃথক শ্রেণি ইনস্ট্যান্ট করা হচ্ছে। এটি ঠিক এটি, ক্লাসটি কেবল একটি সংকলক সংকলনের পরে একটি নাম দেওয়া হয়েছিল।

সাধারণভাবে, আপনার শ্রেণীর সমস্ত বেনাম সাবক্লাসগুলি এই ফ্যাশনে নামকরণ করা হবে:

Poly$1.class, Poly$2.class, Poly$3.class, ... so on

এই সংখ্যাগুলি সেই অর্ডারকে বোঝায় যাতে সেই বেনামী ক্লাসগুলি এনকোলেসিং ক্লাসে প্রদর্শিত হয়।


172
@coders। যথাযথ উত্তর: - আপনি আপনার বিমূর্ত শ্রেণিকে ইনস্ট্যান্ট করতে পারবেন না, তবে আপনি নিজের বিমূর্ত শ্রেণির একটি কংক্রিট সাবক্লাস ইনস্ট্যান্ট করতে পারেন।
রোহিত জৈন 16

16
এক লাইনে আপনি বলতে পারেন: - আপনি কখনও কোনও বিমূর্ত ক্লাস ইনস্ট্যান্ট করতে পারবেন না। এটি একটি বিমূর্ত শ্রেণির উদ্দেশ্য।
রাহুল ত্রিপাঠি

66
শুনে মনে হচ্ছে সাক্ষাত্কারকারীর উত্তরে তার চেয়ে বেশি বিনিয়োগ করা হয়েছে তিনি আপনার চেয়ে ...
নীল টি।

7
অন্য একটি মন্তব্য অনুসারে (একটি জেএলএস রেফারেন্স সহ ) "একটি বস্তুকে তার শ্রেণি এবং তার শ্রেণীর সমস্ত সুপারক্লাসের উদাহরণ বলা হয়" - সুতরাং, আমরা কি এখানে প্রযুক্তিগতভাবে এখানে বিমূর্ত শ্রেণির উদাহরণ তৈরি করছি না? অর্থাত্ অ্যাবস্ট্রাক্ট ক্লাস ইনস্ট্যান্ট করছে?
আর্শাজি

6
@ আরএস আমি বলব যে একটি instance ofএবং এর মধ্যে পার্থক্য রয়েছে instantiating। আপনি কেবল একটি শ্রেণি ইনস্ট্যান্ট করেন, যখন আপনি যে বস্তুটি তৈরি করেন তা উত্তরাধিকারের কারণে একাধিক শ্রেণীর উদাহরণ হতে পারে।
সাইমন ফারসবার্গ

89

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

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


10
কড়া কথা বলতে গেলে বিমূর্ত সুপারক্লাস তাত্ক্ষণিকভাবে হয় না। ইন্সট্রাকশন ভেরিয়েবল আরম্ভ করার জন্য এটি কনস্ট্রাক্টরকে বলা হয়।
অনুমান 16

4
হ্যাঁ এটি হ'ল: subclassInstance instanceof SuperClassসত্য ফিরে আসবে, সুতরাং বস্তুটি সুপারক্লাসের একটি উদাহরণ, যার অর্থ সুপারক্লাসটি ইনস্ট্যান্সিয়েটেড হয়েছে। তবে এটি সিমেন্টিক নিটপিকিং।
জেবি নিজেট 16

5
প্রকৃতপক্ষে শব্দার্থক হতে পারে। জাভা নতুন কীওয়ার্ডের মাধ্যমে অবজেক্ট তৈরির ক্ষেত্রে ইনস্ট্যান্টেশনকে সংজ্ঞায়িত করে (কোনটি আপনি বিমূর্ত শ্রেণীর সাথে করতে পারেন না)। তবে অবশ্যই কংক্রিটের সাবক্লাসটি সঠিকভাবে রিপোর্ট করবে যে এটি তার পিতামাতার শ্রেণিবদ্ধের প্রতিটি সদস্যের একটি উদাহরণ।
অনুমান 16

11
জেএলএসের অনুচ্ছেদ 4..১২. says বলেছেন: "একটি বস্তুকে তার শ্রেণীর এবং তার শ্রেণীর সমস্ত সুপারক্লাসের উদাহরণ বলা হয়।"
জেবি নিজেট

85

= my() {};মানে একটি বেনামী বাস্তবায়ন, একটি অবজেক্ট নয় সহজ ইনস্ট্যান্স, যা হওয়া উচিত ছিল সেখানে যে: = my()। আপনি কখনই কোনও বিমূর্ত ক্লাস ইনস্ট্যান্ট করতে পারবেন না।


30

আপনি যে পর্যবেক্ষণগুলি করতে পারেন তা কেবল:

  1. কেন polyবাড়ে my? এটি অকেজো ...
  2. সংকলনের ফলাফল কী? তিন ফাইলগুলি: my.class, poly.classএবংpoly$1.class
  3. আমরা যদি এর মতো কোনও বিমূর্ত শ্রেণিকে ইনস্ট্যান্ট করতে পারি তবে আমরা একটি ইন্টারফেসও ইনস্ট্যান্ট করতে পারি ... অদ্ভুত ...


আমরা কি একটি বিমূর্ত ক্লাস ইনস্ট্যান্ট করতে পারি?

না, আমরা পারি না। আমরা যা করতে পারি তা হল, একটি বেনাম শ্রেণি তৈরি করুন (এটি তৃতীয় ফাইল) এবং এটি ইনস্ট্যান্ট করুন।


সুপার ক্লাস ইনস্ট্যান্টেশন সম্পর্কে কী?

বিমূর্ত সুপার বর্গটি আমাদের দ্বারা নয় বরং জাভা দ্বারা ইনস্ট্যান্ট হয় ।

সম্পাদনা: এটি পরীক্ষা করতে বলুন

public static final void main(final String[] args) {
    final my m1 = new my() {
    };
    final my m2 = new my() {
    };
    System.out.println(m1 == m2);

    System.out.println(m1.getClass().toString());
    System.out.println(m2.getClass().toString());

}

আউটপুট হল:

false
class my$1
class my$2

পর্যবেক্ষণ 3 জন্য +1: যেমন, আমরা কি করতে পারি Serializable s = new Serializable() {};(যা প্রশংসনীয় বেহুদা হয়) এবং যদি বাঁধা সম্মুখের আপনার কোড দিতে হবে class my$3(অথবা যাই হোক না কেন শ্রেণী এবং সংখ্যা পরিক্ষেপ)
notmaynard - পুনর্বহাল মনিকা

18

আপনি কেবল একটি লাইনে উত্তর দিতে পারেন

না , আপনি কখনও অ্যাবস্ট্রাক্ট ক্লাসের উদাহরণ দিতে পারবেন না

তবে, সাক্ষাত্কারকারীর এখনও একমত হয় না, তারপরে আপনি তাকে / তাকে বলতে পারেন

আপনি যা করতে পারেন তা হ'ল আপনি একটি বেনাম শ্রেণি তৈরি করতে পারেন।

এবং, বেনাম শ্রেণীর মতে, ক্লাস একই স্থান / লাইনে ঘোষিত এবং তাত্ক্ষণিক হয়

সুতরাং, এটি সম্ভবত সম্ভব হতে পারে যে, সাক্ষাত্কারকারীর আপনার আত্মবিশ্বাসের স্তর এবং ওওপিগুলি সম্পর্কে আপনি কতটা জানেন তা পরীক্ষা করতে আগ্রহী।


17

প্রযুক্তিগত অংশটি অন্যান্য উত্তরে ভালভাবে কভার করা হয়েছে, এবং এটি মূলত এর মধ্যে শেষ হয়:
"তিনি ভুল, তিনি জিনিস জানেন না, তাকে এসওয়েতে যোগ দিতে এবং এটি সমস্ত সাফ করার জন্য জিজ্ঞাসা করুন :)"

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

পিএস: কেন জানি না তবে আমার মনে হয় যে সাক্ষাত্কারকারী এই পোস্টটি পড়েছে।


13

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

এর সেরা উদাহরণ হ'ল

যদিও ক্যালেন্ডার শ্রেণিতে একটি বিমূর্ত পদ্ধতি getInstance () রয়েছে তবে আপনি যখন বলবেনCalendar calc=Calendar.getInstance();

"গ্রেগরিয়ানক্যালেন্ডার ক্যালেন্ডার প্রসারিত করে ক্যালক গ্রেগরিয়ানক্যালেন্ডার শ্রেণীর শ্রেণীর উদাহরণটিকে উল্লেখ করছে "

প্রকৃত বেনামে অভ্যন্তরীণ প্রকার আপনাকে বিমূর্ত শ্রেণীর একটি নাম নামক সাবক্লাস এবং এটির উদাহরণ তৈরি করতে দেয়


11

প্রযুক্তিগত উত্তর

বিমূর্ত শ্রেণিগুলি তাত্ক্ষণিকভাবে চালু করা যায় না - এটি সংজ্ঞা এবং ডিজাইন দ্বারা।

জেএলএস থেকে, অধ্যায় 8 ক্লাস:

একটি মনোনীত শ্রেণিকে বিমূর্ত ঘোষণা করা যেতে পারে (§8.1.1.1) এবং এটি অসম্পূর্ণভাবে প্রয়োগ করা হলে বিমূর্ত ঘোষণা করতে হবে; এই জাতীয় শ্রেণি তাত্ক্ষণিকভাবে চালু করা যায় না, তবে উপশ্রেণী দ্বারা প্রসারিত করা যেতে পারে।

ক্লাস.নিউইনস্ট্যান্সের জন্য জেএসই 6 জাভা ডক থেকে:

ইনস্ট্যান্টেশন এক্সেপশন - যদি এই শ্রেণিটি একটি বিমূর্ত শ্রেণি, একটি ইন্টারফেস, একটি অ্যারে শ্রেণি, একটি আদিম ধরণের বা শূন্যতার প্রতিনিধিত্ব করে; বা শ্রেণীর যদি কোনও নালারী নির্মাণকারী না থাকে; বা যদি অন্য কোনও কারণে ইনস্ট্যান্টেশন ব্যর্থ হয়।

আপনি অবশ্যই একটি বিমূর্ত শ্রেণীর একটি কংক্রিট সাবক্লাস ইনস্ট্যান্ট করতে পারেন (একটি বেনামে সাবক্লাস সহ) এবং একটি বিমূর্ত প্রকারের জন্য কোনও অবজেক্ট রেফারেন্সের টাইপকাস্টও চালিয়ে যেতে পারেন।

এটির একটি আলাদা কোণ - টিম্প্লে এবং সামাজিক বুদ্ধি:

এই জটিল প্রযুক্তিগত ভুল বোঝাবুঝি বাস্তব বিশ্বে ঘন ঘন ঘটে যখন আমরা জটিল প্রযুক্তি এবং আইনীকরণের নির্দিষ্টকরণের সাথে কাজ করি with

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

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


7

এটা একটা সুপ্রতিষ্ঠিত সত্য যে abstract classপারেন না instantiated করা যেমন সবাই উত্তর।

প্রোগ্রামটি যখন বেনাম শ্রেণীর সংজ্ঞা দেয়, সংকলকটি আসলে আলাদা নামের সাথে একটি নতুন ক্লাস তৈরি করে ( EnclosedClassName$nযেখানে nবেনাম শ্রেণীর সংখ্যাটি রয়েছে তার নিদর্শন রয়েছে)

সুতরাং আপনি যদি এই জাভা ক্লাসটি ডিসম্পাইল করে থাকেন তবে নীচের মত কোডটি পাবেন:

আমার ক্লাস

abstract class my { 
    public void mymethod() 
    { 
        System.out.print("Abstract"); 
    }
} 

বহু $ 1.class ("বেনাম শ্রেণীর" উত্পন্ন শ্রেণি)

class poly$1 extends my 
{
} 

ploly.cass

public class poly extends my
{
    public static void main(String[] a)
    {
        my m = new poly.1(); // instance of poly.1 class NOT the abstract my class

        m.mymethod();
    }
}

4

না, আপনি কোনও বিমূর্ত ক্লাসটি তাত্ক্ষণিকভাবে চালু করতে পারবেন না W আমরা কেবল বেনাম শ্রেণি ইনস্ট্যান্ট করি I


4

অ্যাবস্ট্রাক্ট ক্লাস সম্পর্কে

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

একটি বিমূর্ত শ্রেণীর উদ্দেশ্য বেসের মতো আচরণ করা। উত্তরাধিকারের শ্রেণিবিন্যাসে আপনি শীর্ষের দিকে বিমূর্ত শ্রেণি দেখতে পাবেন।


3

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


3

ক্লাস প্রসারিত করার অর্থ এই নয় যে আপনি ক্লাসটি ইনস্ট্যান্ট করছেন। আসলে, আপনার ক্ষেত্রে আপনি সাবক্লাসের একটি উদাহরণ তৈরি করছেন।

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

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

  1. একটি খালি ক্লাস তৈরি করুন
  2. বিমূর্ত শ্রেণি থেকে এটি উত্তরাধিকারী
  3. বিক্ষিপ্ত শ্রেণীর ইনস্ট্যান্ট করুন

সুতরাং আপনি উত্পন্ন শ্রেণীর উদাহরণের মাধ্যমে বিমূর্ত শ্রেণিতে সমস্ত পদ্ধতি এবং বৈশিষ্ট্যগুলিতে অ্যাক্সেস পান।


2

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

   public abstract class AbstractGridManager {
        private LifecicleAlgorithmIntrface lifecicleAlgorithm;
        // ... more private fields

        //Method implemented in concrete Manager implementors 
        abstract public Grid initGrid();

        //Methods common to all implementors
        public Grid calculateNextLifecicle(Grid grid){
            return this.getLifecicleAlgorithm().calculateNextLifecicle(grid);
        }

        public LifecicleAlgorithmIntrface getLifecicleAlgorithm() {
            return lifecicleAlgorithm;
        }
        public void setLifecicleAlgorithm(LifecicleAlgorithmIntrface lifecicleAlgorithm) {
            this.lifecicleAlgorithm = lifecicleAlgorithm;
        }
        // ... more common logic and getters-setters pairs
    }

কংক্রিট প্রয়োগকারীকে কেবল বিমূর্ত হিসাবে ঘোষিত পদ্ধতিগুলি প্রয়োগ করতে হবে তবে বিমূর্ত ঘোষিত নয় এমন বিমূর্ত শ্রেণিতে classes শ্রেণিতে প্রয়োগ করা যুক্তির অ্যাক্সেস থাকবে:

public class FileInputGridManager extends AbstractGridManager {

private String filePath;

//Method implemented in concrete Manager implementors 
abstract public Grid initGrid();

public class FileInputGridManager extends AbstractGridManager {

    private String filePath;

    //Method implemented in concrete Manager implementors 
    abstract public Grid initGrid();

    public Grid initGrid(String filePath) {
        List<Cell> cells = new ArrayList<>();
        char[] chars;
        File file = new File(filePath); // for example foo.txt
        // ... more logic
        return grid;
    }
}

তারপরে অবশেষে কারখানাটি এরকম কিছু দেখাচ্ছে:

public class GridManagerFactory {
    public static AbstractGridManager getGridManager(LifecicleAlgorithmIntrface lifecicleAlgorithm, String... args){
        AbstractGridManager manager = null;

        // input from the command line
        if(args.length == 2){
            CommandLineGridManager clManager = new CommandLineGridManager();
            clManager.setWidth(Integer.parseInt(args[0]));
            clManager.setHeight(Integer.parseInt(args[1]));
            // possibly more configuration logic
            ...
            manager = clManager;
        } 
        // input from the file
        else if(args.length == 1){
            FileInputGridManager fiManager = new FileInputGridManager();
            fiManager.setFilePath(args[0]);
            // possibly more method calls from abstract class
            ...
            manager = fiManager ;
        }
        //... more possible concrete implementors
        else{
            manager = new CommandLineGridManager();
        }
        manager.setLifecicleAlgorithm(lifecicleAlgorithm);
        return manager;
    }
}

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


2

না, আমরা বিমূর্ত শ্রেণীর অবজেক্টটি তৈরি করতে পারি না, তবে বিমূর্ত শ্রেণীর রেফারেন্স ভেরিয়েবল তৈরি করতে পারি। রেফারেন্স ভেরিয়েবল উদ্ভূত শ্রেণীর অবজেক্টগুলি বোঝাতে ব্যবহৃত হয় (বিমূর্ত শ্রেণির উপ শ্রেণি)

এই ধারণাটি চিত্রিত করার উদাহরণ এখানে

abstract class Figure { 

    double dim1; 

    double dim2; 

    Figure(double a, double b) { 

        dim1 = a; 

        dim2 = b; 

    } 

    // area is now an abstract method 

    abstract double area(); 

    }


    class Rectangle extends Figure { 
        Rectangle(double a, double b) { 
        super(a, b); 
    } 
    // override area for rectangle 
    double area() { 
        System.out.println("Inside Area for Rectangle."); 
        return dim1 * dim2; 
    } 
}

class Triangle extends Figure { 
    Triangle(double a, double b) { 
        super(a, b); 
    } 
    // override area for right triangle 
    double area() { 
        System.out.println("Inside Area for Triangle."); 
        return dim1 * dim2 / 2; 
    } 
}

class AbstractAreas { 
    public static void main(String args[]) { 
        // Figure f = new Figure(10, 10); // illegal now 
        Rectangle r = new Rectangle(9, 5); 
        Triangle t = new Triangle(10, 8); 
        Figure figref; // this is OK, no object is created 
        figref = r; 
        System.out.println("Area is " + figref.area()); 
        figref = t; 
        System.out.println("Area is " + figref.area()); 
    } 
}

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


0

আসলে আমরা সরাসরি একটি বিমূর্ত শ্রেণীর কোনও বস্তু তৈরি করতে পারি না। আমরা যা তৈরি করি তা বিমূর্ত কলের একটি রেফারেন্স ভেরিয়েবল। রেফারেন্স ভেরিয়েবলটি ক্লাসের অবজেক্টের রেফারেন্স করতে ব্যবহৃত হয় যা অ্যাবস্ট্রাক্ট ক্লাস অর্থাৎ অ্যাবস্ট্রাক্ট ক্লাসের সাবক্লাস উত্তরাধিকার সূত্রে প্রাপ্ত হয়।

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