আমি এই প্রশ্ন অনুসরণ করছি , কিন্তু আমি কোড থেকে আমার নীতি একটি নীতি পরিবর্তন করছি।
লিসকভ সাবস্টিটিউশন নীতি (এলএসপি) সম্পর্কে আমার উপলব্ধি থেকে , আমার বেস ক্লাসে যে কোনও পদ্ধতিই হোক না কেন, সেগুলি অবশ্যই আমার সাবক্লাসে প্রয়োগ করা উচিত, এবং এই পৃষ্ঠা অনুসারে , যদি আপনি বেস ক্লাসে কোনও পদ্ধতিকে ওভাররাইড করেন এবং এটি কিছু না করে বা ছুড়ে ফেলে ব্যতিক্রম, আপনি নীতি লঙ্ঘন করছি।
এখন, আমার সমস্যাটি এইভাবে সংক্ষিপ্ত করা যেতে পারে: আমার একটি বিমূর্ততা Weapon
class
এবং দুটি শ্রেণি রয়েছে Sword
এবং Reloadable
। যদি Reloadable
একটি নির্দিষ্ট method
, নামক থাকে Reload()
তবে এটি অ্যাক্সেস করার জন্য আমাকে ডাউনকাস্ট করতে হবে method
এবং আদর্শভাবে আপনি এটি এড়াতে চান want
আমি তখন ব্যবহার করার কথা ভেবেছিলাম Strategy Pattern
। এইভাবে প্রতিটি অস্ত্র কেবল এটি সম্পাদন করতে সক্ষম সেগুলি সম্পর্কে সচেতন ছিল, সুতরাং উদাহরণস্বরূপ, একটি Reloadable
অস্ত্র স্পষ্টতই পুনরায় লোড করতে পারে, তবে একটি Sword
করতে পারে না এবং এমনকি একটি সম্পর্কে অবগতও নয় Reload class/method
। আমি আমার স্ট্যাক ওভারফ্লো পোস্টে যেমন বলেছি, আমাকে হ্রাস করতে হবে না এবং আমি কোনও List<Weapon>
সংগ্রহ বজায় রাখতে পারি ।
উপর আরেকটি ফোরাম , প্রথম উত্তর করার জন্য পরামর্শ দেওয়া Sword
সচেতন হতে হবে Reload
শুধু কিছু করবেন না। উপরে উল্লিখিত স্ট্যাক ওভারফ্লো পৃষ্ঠায় এই একই উত্তর দেওয়া হয়েছিল।
আমি কেন পুরোপুরি বুঝতে পারি না। নীতিটি লঙ্ঘন করে তরোয়ালকে সচেতন হওয়ার Reload
এবং এটিকে ফাঁকা রাখার অনুমতি দেয় কেন ? আমি আমার স্ট্যাক ওভারফ্লো পোস্টে যেমন বলেছিলাম, এসপি আমার সমস্যাগুলি বেশিরভাগ সমাধান করেছে।
কেন এটি একটি কার্যকর সমাধান নয়?
public final Weapon{
private final String name;
private final int damage;
private final List<AttackStrategy> validactions;
private final List<Actions> standardActions;
private Weapon(String name, int damage, List<AttackStrategy> standardActions, List<Actions> attacks)
{
this.name = name;
this.damage = damage;
standardActions = new ArrayList<Actions>(standardActions);
validAttacks = new ArrayList<AttackStrategy>(validActions);
}
public void standardAction(String action){} // -- Can call reload or aim here.
public int attack(String action){} // - Call any actions that are attacks.
public static Weapon Sword(String name, damage, List<AttackStrategy> standardActions, List<Actions> attacks){
return new Weapon(name, damage,standardActions, attacks) ;
}
}
আক্রমণ ইন্টারফেস এবং বাস্তবায়ন:
public interface AttackStrategy{
void attack(Enemy enemy);
}
public class Shoot implements AttackStrategy {
public void attack(Enemy enemy){
//code to shoot
}
}
public class Strike implements AttackStrategy {
public void attack(Enemy enemy){
//code to strike
}
}
reload()
ফাঁকা ছেড়ে যান বা standardActions
পুনরায় লোড অ্যাকশন না থাকা কেবল একটি আলাদা প্রক্রিয়া। কোন মৌলিক পার্থক্য নেই। আপনি উভয় করতে পারেন। => আপনার সমাধান হয় টেকসই (যা আপনার প্রশ্ন ছিল না) .; অস্ত্রগুলিতে একটি ফাঁকা ডিফল্ট বাস্তবায়ন থাকলে তরোয়ালটি পুনরায় লোড সম্পর্কে জানতে হবে না।
class Weapon { bool supportsReload(); void reload(); }
। পুনরায় লোড করার আগে ক্লায়েন্টরা সমর্থন করলে তা পরীক্ষা করে দেখবে।reload
iff নিক্ষেপ করার জন্য চুক্তিবদ্ধভাবে সংজ্ঞায়িত করা হয়!supportsReload()
। এটি এলএসপি-র অনুসরণ করে যদি ড্রাইভ করা ক্লাসগুলি আমি ঠিকই উল্লিখিত প্রোটোকলের সাথে মেনে চলে।