জাভাতে "বিমূর্ত শ্রেণি" কী?
জাভাতে "বিমূর্ত শ্রেণি" কী?
উত্তর:
একটি বিমূর্ত শ্রেণি এমন একটি বর্গ যা তাত্ক্ষণিকভাবে চলতে পারে না। একটি বিমূর্ত বর্গ একটি inheriting উপশ্রেণী যে তৈরি করে ব্যবহার করা হয় করতে instantiated হবে না। উত্তরাধিকারী সাবক্লাসের জন্য একটি বিমূর্ত শ্রেণি কয়েকটি কাজ করে:
এখানে একটি উদাহরণ:
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!"); }
}
আপনি কোনও ইন্টারফেসে পদ্ধতিগুলি প্রয়োগ করতে পারবেন না। এর অর্থ হ'ল আপনি যদি দুটি পৃথক ইন্টারফেস প্রয়োগ করেন তবে সেই ইন্টারফেসের বিভিন্ন পদ্ধতির সংঘর্ষ ঘটতে পারে না। একটি ইন্টারফেসের সমস্ত পদ্ধতি যেহেতু বিমূর্ত, তাই আপনাকে পদ্ধতিটি প্রয়োগ করতে হবে এবং যেহেতু আপনার পদ্ধতিটি উত্তরাধিকার গাছের একমাত্র বাস্তবায়ন, তাই সংকলক জানে যে এটি আপনার পদ্ধতিটি ব্যবহার করতে হবে।
c.implementedMethod()
" ওভারডেন !" ছাপবেন কেন ? SecondImplementingClass
ওভাররাইড নেই implementedMethod()
।
একটি জাভা ক্লাস নিম্নলিখিত শর্তাবলী বিমূর্ত হয়ে যায়:
কমপক্ষে একটি পদ্ধতির বিমূর্ত হিসাবে চিহ্নিত করা হয়েছে:
public abstract void myMethod()
সেক্ষেত্রে সংকলক আপনাকে পুরো ক্লাসটিকে বিমূর্ত হিসাবে চিহ্নিত করতে বাধ্য করে।
ক্লাসটি বিমূর্ত হিসাবে চিহ্নিত করা হয়েছে:
abstract class MyClass
যেমন ইতিমধ্যে বলেছে: আপনার যদি বিমূর্ত পদ্ধতি থাকে তবে সংকলক আপনাকে পুরো শ্রেণিকে বিমূর্ত হিসাবে চিহ্নিত করতে বাধ্য করে। তবে আপনার কোনও বিমূর্ত পদ্ধতি না থাকলেও আপনি ক্লাসটিকে বিমূর্ত হিসাবে চিহ্নিত করতে পারেন।
সাধারন ব্যবহার:
বিমূর্ত ক্লাসগুলির একটি সাধারণ ব্যবহার হ'ল ইন্টারফেসের মতো ক্লাসের একটি রূপরেখা সরবরাহ করা। তবে একটি ইন্টারফেসের বিপরীতে এটি ইতিমধ্যে কার্যকারিতা সরবরাহ করতে পারে, অর্থাত শ্রেণীর কিছু অংশ বাস্তবায়িত হয়েছে এবং কিছু অংশ কেবল একটি পদ্ধতি ঘোষণার সাথে সজ্জিত রয়েছে। ( "বিমূর্ত")
একটি বিমূর্ত শ্রেণি তাত্ক্ষণিকভাবে চালু করা যায় না, তবে আপনি একটি বিমূর্ত শ্রেণীর উপর ভিত্তি করে একটি কংক্রিট শ্রেণি তৈরি করতে পারেন, যা পরে তাত্ক্ষণিকভাবে তৈরি করা যেতে পারে। এটি করতে আপনাকে বিমূর্ত শ্রেণীর উত্তরাধিকারী হতে হবে এবং বিমূর্ত পদ্ধতিগুলিকে ওভাররাইড করতে হবে, অর্থাত্ সেগুলি প্রয়োগ করুন।
abstract
ক্লাসের বিমূর্ত হওয়ার জন্য কীওয়ার্ডটি প্রয়োজনীয়। কিন্তু একটি কংক্রিট শ্রেণিতে কোনও পদ্ধতি থাকতে পারে না । সুতরাং আপনার ক্লাসে যদি কোনও পদ্ধতি থাকে তবে এটি সংকলকটির ক্লাস হিসাবে ঘোষণা করতে হবে । abstract
abstract
abstract
বিমূর্ত কীওয়ার্ড ব্যবহার করে ঘোষিত একটি শ্রেণি হিসাবে পরিচিত 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);
}
জাভাতে বিমূর্ততা অর্জনের উপায়
জাভাতে বিমূর্ততা অর্জনের দুটি উপায় রয়েছে
কনস্ট্রাক্টর, ডেটা সদস্য, পদ্ধতি, ইত্যাদি সহ বিমূর্ত শ্রেণি 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
।
তথ্যসূত্র:
এটি এমন একটি শ্রেণি যা তাত্ক্ষণিকভাবে চালু করা যায় না, এবং সম্ভবত শ্রেণিবদ্ধ প্রয়োগকারী ক্লাসগুলি এটির রূপরেখার মতো বিমূর্ত পদ্ধতি প্রয়োগ করতে বাধ্য করে।
সহজ কথায় বলতে গেলে আপনি কিছুটা বেশি দক্ষতার সাথে ইন্টারফেসের মতো একটি বিমূর্ত শ্রেণিকে ভাবতে পারেন।
আপনি কোনও ইন্টারফেস ইনস্ট্যান্ট করতে পারবেন না, এটি একটি বিমূর্ত শ্রেণীর জন্যও রয়েছে।
আপনার ইন্টারফেসে আপনি কেবল পদ্ধতি শিরোনাম সংজ্ঞায়িত করতে পারেন এবং সমস্ত প্রয়োগকারী তাদের সমস্ত প্রয়োগ করতে বাধ্য হয় । একটি বিমূর্ত শ্রেণিতে আপনি নিজের পদ্ধতির শিরোনামগুলি সংজ্ঞায়িত করতে পারেন তবে এখানে - ইন্টারফেসের পার্থক্যের জন্য - আপনি পদ্ধতির শরীরকে (সাধারণত একটি ডিফল্ট বাস্তবায়ন) সংজ্ঞায়িত করতে পারেন। তদুপরি যখন অন্যান্য ক্লাসগুলি প্রসারিত হয় (নোট করুন, বাস্তবায়ন করবেন না এবং সেইজন্য আপনার প্রতি শিশু বর্গের জন্য কেবল একটি বিমূর্ত শ্রেণি থাকতে পারে) আপনার বিমূর্ত শ্রেণিগুলি, তারা আপনার বিমূর্ত শ্রেণির সমস্ত পদ্ধতি প্রয়োগ করতে বাধ্য হয় না, যদি না আপনি কোনও বিমূর্ত পদ্ধতি নির্দিষ্ট করে থাকেন ( এই ক্ষেত্রে এটি ইন্টারফেসের মতো কাজ করে, আপনি পদ্ধতিটির মূল সংজ্ঞা দিতে পারবেন না)।
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();
}
ওরাকল ডকুমেন্টেশন থেকে
বিমূর্ত পদ্ধতি এবং শ্রেণি:
একটি বিমূর্ত শ্রেণি একটি শ্রেণি যা বিমূর্ত ঘোষণা করা হয় - এটি বিমূর্ত পদ্ধতি অন্তর্ভুক্ত বা নাও থাকতে পারে
বিমূর্ত শ্রেণিগুলি তাত্ক্ষণিকভাবে চালু করা যায় না, তবে সেগুলি সাবক্ল্যাস করা যেতে পারে
একটি বিমূর্ত পদ্ধতি একটি পদ্ধতি যা বাস্তবায়ন ছাড়াই ঘোষিত হয় (বন্ধনীগুলি ছাড়াই এবং সেমিকোলন অনুসরণ করে), এর মতো:
abstract void moveTo(double deltaX, double deltaY);
যদি কোনও শ্রেণিতে বিমূর্ত পদ্ধতি অন্তর্ভুক্ত থাকে তবে ক্লাসটি নিজেই বিমূর্ত হিসাবে ঘোষণা করতে হবে:
public abstract class GraphicObject {
// declare fields
// declare nonabstract methods
abstract void draw();
}
যখন কোনও বিমূর্ত শ্রেণি উপশৃঙ্খলিত হয়, তখন সাবক্লাস সাধারণত তার পিতামাত্ত শ্রেণীর সমস্ত বিমূর্ত পদ্ধতিগুলির জন্য বাস্তবায়ন সরবরাহ করে। তবে এটি যদি না হয় তবে সাবক্লাসটি অবশ্যই বিমূর্ত হিসাবে ঘোষণা করতে হবে ।
যেহেতু abstract classes
এবং interfaces
সম্পর্কিত, নীচে এসই প্রশ্নগুলি দেখুন:
একটি ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে পার্থক্য কী?
একটি ইন্টারফেস এবং একটি বিমূর্ত শ্রেণীর মধ্যে পার্থক্যটি আমি কীভাবে ব্যাখ্যা করব?
আপনার উত্তরগুলি এখানে পান:
জাভাতে বিমূর্ত শ্রেণি বনাম ইন্টারফেস
একটি বিমূর্ত শ্রেণীর একটি চূড়ান্ত পদ্ধতি থাকতে পারে?
বিটিডব্লিউ - আপনি সম্প্রতি জিজ্ঞাসা করা প্রশ্নগুলি। খ্যাতি বাড়াতে নতুন প্রশ্ন সম্পর্কে চিন্তা করুন ...
সম্পাদনা:
ঠিক বুঝতে পেরেছি যে এর পোস্টারগুলি এবং রেফারেন্সযুক্ত প্রশ্নের একই বা কমপক্ষে একই রকম নাম রয়েছে তবে ব্যবহারকারী-আইডি সর্বদা আলাদা is সুতরাং, কোনও প্রযুক্তিগত সমস্যা আছে, সেই কিউরের আবার লগইন করতে এবং তার প্রশ্নের উত্তরগুলি খুঁজে পেতে সমস্যা আছে বা এটি সম্প্রদায়কে বিনোদন দেওয়ার জন্য এটি এক ধরণের গেম;)
এই সমস্ত পোস্টে সামান্য সংযোজন।
কখনও কখনও আপনি একটি ক্লাস ঘোষণা করতে চাইতে পারেন এবং এখনও জানে না যে কীভাবে সেই শ্রেণীর অন্তর্গত সমস্ত পদ্ধতির সংজ্ঞা দেওয়া যায়। উদাহরণস্বরূপ, আপনি Writer নামে একটি শ্রেণি ঘোষণা করতে এবং এতে লিখন () নামক একটি সদস্য পদ্ধতি অন্তর্ভুক্ত করতে চাইতে পারেন । তবে, আপনি কীভাবে কোড রাইটিং () লিখবেন তা জানেন না কারণ এটি প্রতিটি ধরণের লেখক ডিভাইসের জন্য আলাদা। অবশ্যই, আপনি প্রিন্টার, ডিস্ক, নেটওয়ার্ক এবং কনসোলের মতো লেখকের সাবক্লাস সংগ্রহ করে এটি পরিচালনা করার পরিকল্পনা করছেন।
একটি বিমূর্ত শ্রেণি সরাসরি তাত্ক্ষণিকভাবে চালু করা যায় না, তবে ব্যবহারযোগ্য হওয়ার জন্য অবশ্যই এটি থেকে নেওয়া উচিত। কোনও শ্রেণীর বিমূর্ত হওয়া আবশ্যক যদি এতে বিমূর্ত পদ্ধতি থাকে: সরাসরি হয়
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
}
}
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();
}
একটি বিমূর্ত শ্রেণি একটি শ্রেণি যা বিমূর্ত ঘোষণা করা হয় - এটি বিমূর্ত পদ্ধতি অন্তর্ভুক্ত বা নাও থাকতে পারে। বিমূর্ত শ্রেণিগুলি তাত্ক্ষণিকভাবে চালু করা যায় না, তবে সেগুলি সাবক্ল্যাস করা যেতে পারে।
অন্য কথায়, একটি শ্রেণি যা বিমূর্ত কীওয়ার্ড সহ ঘোষিত হয়, এটি জাভাতে অ্যাবস্ট্রাক্ট শ্রেণি হিসাবে পরিচিত। এটি বিমূর্ত (শরীর ছাড়া পদ্ধতি) এবং অ-বিমূর্ত পদ্ধতি (শরীরের সাথে পদ্ধতি) থাকতে পারে।
গুরুত্বপূর্ণ দ্রষ্টব্য: - অবজেক্ট ক্লাসগুলি বস্তু তাত্ক্ষণিকভাবে ব্যবহার করা যায় না, সেগুলি অবজেক্ট রেফারেন্স তৈরি করতে ব্যবহার করা যেতে পারে, কারণ জাভা রান-টাইম পলিমারফিজমের কাছে সুপারক্লাস রেফারেন্স ব্যবহারের মাধ্যমে প্রয়োগ করা হয়। সুতরাং, এটি অবশ্যই একটি বিমূর্ত শ্রেণীর একটি রেফারেন্স তৈরি করা সম্ভব হবে যাতে এটি সাবক্লাস বস্তুর দিকে নির্দেশ করতে ব্যবহার করা যায়। আপনি নীচের উদাহরণে এই বৈশিষ্ট্যটি দেখতে পাবেন
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();
}
}
একটি বিমূর্ত শ্রেণি এমনটি যা সম্পূর্ণরূপে বাস্তবায়িত হয় না তবে সাবক্লাসগুলির জন্য একটি নীলনকশা সরবরাহ করে। এটি আংশিকভাবে প্রয়োগ করা যেতে পারে যে এটিতে সম্পূর্ণ সংজ্ঞায়িত কংক্রিট পদ্ধতি রয়েছে তবে এটি বিমূর্ত পদ্ধতিও ধারণ করতে পারে। এগুলি স্বাক্ষরযুক্ত পদ্ধতি তবে কোনও পদ্ধতির বডি নয়। যে কোনও সাবক্লাস অবশ্যই প্রতিটি বিমূর্ত পদ্ধতিটির জন্য একটি দেহকে সংজ্ঞায়িত করতে হবে, অন্যথায় এটি অবশ্যই বিমূর্ত হিসাবে ঘোষণা করতে হবে। যেহেতু বিমূর্ত ক্লাসগুলি তাত্ক্ষণিকভাবে চালু করা যায় না, সেগুলি ব্যবহার করার জন্য তাদের কমপক্ষে একটি সাবক্লাস দ্বারা প্রসারিত করতে হবে। বিমূর্ত শ্রেণিকে জেনেরিক শ্রেণি হিসাবে ভাবেন এবং অনুপস্থিত শ্রেণিগুলি অনুপস্থিত তথ্য পূরণ করার জন্য রয়েছে।
বর্গ যা কংক্রিট এবং নন-কংক্রিট উভয় পদ্ধতি থাকতে পারে, যেমন শরীরের সাথে এবং ছাড়াও।
এটি কিছুই করে না, কেবল একটি সাধারণ টেম্পলেট সরবরাহ করুন যা এর সাবক্লাসের জন্য ভাগ করা হবে