আমার সরাসরি ইন্টারফেস প্রয়োগ করা উচিত বা সুপারক্লাসটি করা উচিত?


14

এর মধ্যে কি পার্থক্য আছে?

public class A extends AbstractB implements C
{...}

বনাম...

public class A extends AbstractB
{...}
abstract class AbstractB implements C
{...}

আমি বুঝতে পারি যে উভয় ক্ষেত্রেই, ক্লাস এ ইন্টারফেসের সাথে সঙ্গতিপূর্ণ হবে। দ্বিতীয় ক্ষেত্রে, AbstractBইন্টারফেসের পদ্ধতিগুলির জন্য বাস্তবায়ন সরবরাহ করতে পারে C। এটাই কি একমাত্র পার্থক্য?

আমি ইন্টারফেস পদ্ধতির কোন একটি বাস্তবায়ন প্রদান না চান তাহলে AbstractB , যা শৈলী আমি ব্যবহার করা উচিত ? একটি বা অন্য ব্যবহারের কিছু গোপন 'ডকুমেন্টেশন' উদ্দেশ্য রয়েছে?


3
শিরোনামে পরামর্শ: আমি কি সরাসরি একটি ইন্টারফেস প্রয়োগ করতে পারি বা সুপারক্লাসটি করা উচিত
Jeanne Boyarsky

উত্তর:


20

এটি সব নির্ভর করে কিনা এর উপর নির্ভর করে AbstractB implements C। অর্থাত্ যদি এটি AbstractBপ্রয়োগের জন্য শব্দার্থগতভাবে বোঝায় Cতবে তার জন্য যান go

আমরা যদি দৃ concrete় উদাহরণ নিই তবে অর্থগত পার্থক্য পরিষ্কার হয়ে যায়।

যদি এ = কুকুর, বিমূর্ত বি = প্রাণী, সি = আইবার্ক

জ্ঞান তোলে যে শুধুমাত্র পছন্দ

class Dog extends Animal implements IBark{

এটি কোনও অর্থবোধ করে না, যেহেতু এটি বোঝাচ্ছে যে সমস্ত প্রাণীর ছাঁটা।

class Animal implements IBark{

অন্যান্য পার্থক্যগুলি যদি আপনার class Aকাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্তির চেয়ে আরও বেশি কিছু থাকে তবে তা কার্যকর হবে AbstractB। # 1 এ তাদের সি প্রয়োগ করতে হবে না, # 2 এ তারা সবাই সি প্রয়োগ করতে বাধ্য হয় are


1
আমার উত্তর চেয়ে +1 আরও স্পষ্ট!
হ্যান্ড-ই-ফুড

অতিরিক্তভাবে, যদি ইন্টারফেসটি প্রয়োগ করা Heterotrophযুক্তিসঙ্গত মনে হয় । আপনি যদি অন্যান্য প্রচুর পরিমাণে ঘুরে বেড়ানো প্রাণী আশা করেন এবং তাদের সাথে একইরকম আচরণ করতে চান তবে অন্য শ্রেণিটি যাওয়ার পথ হবে। AnimalHeterotrophBarkingAnimal extends Animal implements IBark
স্কার্ফ্রিজ

@ এসফারফ্রিজ আসলে আমি পশুদের বাড়ার প্রত্যাশা করব তবে আপনার ইনপুটটির Heterotrophজন্য ধন্যবাদ
কার্তিক টি

2

যথাযথ উত্তরাধিকারের সম্পর্ক নির্ধারণের সহজ উপায় হ'ল তাদের নিজের ক্লাসগুলির দিকে নজর দেওয়া নয়, এমন কোডে যা সেই ক্লাসগুলির পদ্ধতিগুলিকে কল করে। আপনার কোডে কোথাও আপনার মতো AbstractB b = new A();বা আছে otherObject.addAbstractB(this);। যে কোনও উপায়ে, আপনি পরে সেই AbstractBপদ্ধতিটি বিভিন্ন পদ্ধতি কল করার জন্য ব্যবহার করেন ।

এই পরিস্থিতিতে, আপনি কি পদ্ধতিগুলি কল করতে চান C? যদি তা হয় তবে AbstractBতা বাস্তবায়ন করা উচিত C। যদি না হয়, এটা করা উচিত নয়। যদি আপনার মতো পরিস্থিতি না থাকে তবে আপনার উত্তরাধিকারের প্রয়োজন হবে না এবং পরিবর্তে রচনাটি ব্যবহার করার জন্য অ্যাক্টেক্টর ব্যবহার করা উচিত কারণ এটি বেশ লঘু মিশ্রিত।


2

এটি কোনও "লুকানো" ডকুমেন্টেশনের উদ্দেশ্য নয়। এটি আপনাকে অ্যাবস্ট্রাকবি এবং এটির সবকটি সাবক্ল্যাসিকে সিতে কাস্ট করতে দেয় সেখানে তিনটি স্টাইল রয়েছে।

public class A extends AbstractB implements C
public class AbstractB

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

public class A extends AbstractB
public AbstractB implements C

আমি এইটি ব্যবহার করতাম যদি আমি চাই যে সমস্ত সাবক্লাসগুলি ইন্টারফেসটি বাস্তবায়িত করতে পারে এবং তাদের সকলের পক্ষে এটি করা বোধগম্য হয়। যেমন বিগল অ্যাবস্ট্রাকডগ প্রয়োগ করে ওয়াগ ag

public class A extends AbstractB implements C
public class AbstractB implements C

এটি এক অনর্থক তবে স্বচ্ছতা যোগ করতে পারে add


আমি মনে করি ২ য় অনুচ্ছেদে "অ্যাবস্ট্রাকসি" (যা প্রশ্নের মধ্যে বিদ্যমান নেই) পরিবর্তন করে "অ্যাবস্ট্রাকবি" করা উচিত। আমি সম্পাদনা করতে পারি না যেহেতু সম্পাদকদের অবশ্যই কমপক্ষে 6 টি অক্ষর থাকতে হবে।
cellepo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.