এই উত্তরটি একটি বিমূর্ত শ্রেণি এবং একটি ইন্টারফেসের মধ্যে পার্থক্য ব্যাখ্যা করার জন্য একটি ভাল কাজ করে তবে আপনার কেন একটি ঘোষণা করা উচিত তা তার উত্তর দেয় না ।
খাঁটি প্রযুক্তিগত দৃষ্টিকোণ থেকে কোনও শ্রেণিকে বিমূর্ত হিসাবে ঘোষণার প্রয়োজন হয় না ।
নিম্নলিখিত তিনটি শ্রেণী বিবেচনা করুন:
class Database {
public String[] getTableNames() { return null; } //or throw an exception? who knows...
}
class SqlDatabase extends Database { } //TODO: override getTableNames
class OracleDatabase extends Database { } //TODO: override getTableNames
আপনি না আছে যখন আপনি এই প্রোগ্রাম লেখা হয়, আপনি টাইপ পারে: যদিও সেখানে তার বাস্তবায়ন সঙ্গে একটি সুস্পষ্ট সমস্যা হচ্ছে, ডাটাবেজ বর্গ বিমূর্ত করতে new Database()
এবং এটি বৈধ হতে পারে, কিন্তু এটা কাজ না।
নির্বিশেষে, আপনি এখনও পলিমারফিজম পাবেন, যতক্ষণ না আপনার প্রোগ্রামটি কেবল তৈরি করে SqlDatabase
এবং OracleDatabase
উদাহরণ হিসাবে আপনি এই পদ্ধতি লিখতে পারেন:
public void printTableNames(Database database) {
String[] names = database.getTableNames();
}
অ্যাবস্ট্রাক্ট ক্লাসগুলি বিকাশকারীকে বেস ক্লাসটি ইনস্ট্যান্ট করতে বাধা দিয়ে পরিস্থিতি উন্নত করে , কারণ কোনও বিকাশকারী এটির কার্যকারিতা অনুপস্থিত হিসাবে চিহ্নিত করেছেন । এটি সংকলন-সময় সুরক্ষাও সরবরাহ করে যাতে আপনি নিশ্চিত করতে পারেন যে আপনার বিমূর্ত শ্রেণিকে প্রসারিত যে কোনও ক্লাসগুলি কাজ করার জন্য খালি ন্যূনতম কার্যকারিতা সরবরাহ করে এবং উত্তরাধিকারীদের কোনওভাবে হ'ল স্টাব পদ্ধতি (উপরের মতো) রাখার বিষয়ে আপনাকে চিন্তা করার দরকার নেই you জাদুর জানি যে, তারা আছে যাতে এটা কাজ করতে একটি পদ্ধতি ওভাররাইড করতে।
ইন্টারফেস একটি সম্পূর্ণ পৃথক বিষয়। একটি ইন্টারফেস আপনাকে কোনও বস্তুতে কী কী অপারেশন সম্পাদন করতে পারে তা বর্ণনা করতে দেয়। অন্যান্য উপাদান, বস্তু ইত্যাদির পরিষেবাগুলি ব্যবহার করে এমন পদ্ধতি, উপাদান ইত্যাদির লেখার সময় আপনি সাধারণত ইন্টারফেসগুলি ব্যবহার করেন তবে আপনি কীভাবে পরিষেবাগুলি পাচ্ছেন তা প্রকৃত ধরণের অবজেক্টের কোনও যত্ন নেই।
নিম্নলিখিত পদ্ধতিটি বিবেচনা করুন:
public void saveToDatabase(IProductDatabase database) {
database.addProduct(this.getName(), this.getPrice());
}
database
কোনও নির্দিষ্ট অবজেক্ট থেকে অবজেক্টটি উত্তরাধিকার সূত্রে এসেছে কিনা সে বিষয়ে আপনি চিন্তা করেন না , আপনি কেবল যত্নবান হন যে এটির কোনও addProduct
পদ্ধতি রয়েছে। সুতরাং এই ক্ষেত্রে আপনার ইন্টারফেসটি আপনার সমস্ত ক্লাসকে একই বেস শ্রেণীর উত্তরাধিকারী হওয়ার চেয়ে আরও উপযুক্ত better
কখনও কখনও দুজনের সংমিশ্রণটি খুব সুন্দরভাবে কাজ করে। উদাহরণ স্বরূপ:
abstract class RemoteDatabase implements IProductDatabase {
public abstract String[] connect();
public abstract void writeRow(string col1, string col2);
public void addProduct(String name, Double price) {
connect();
writeRow(name, price.toString());
}
}
class SqlDatabase extends RemoteDatabase {
//TODO override connect and writeRow
}
class OracleDatabase extends RemoteDatabase {
//TODO override connect and writeRow
}
class FileDatabase implements IProductDatabase {
public void addProduct(String name, Double price) {
//TODO: just write to file
}
}
লক্ষ্য করুন যে কীভাবে কিছু কার্যকারিতা ভাগ করার জন্য কিছু ডেটাবেস রিমোটড্যাটাবেসেস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় (যেমন একটি সারি লেখার আগে সংযোগ স্থাপন করা) তবে ফাইলডাটাবেসগুলি পৃথক শ্রেণি যা কেবল প্রয়োগ করে IProductDatabase
।