সুরক্ষিত পদ্ধতির জন্য বাস্তব-বিশ্বের পরিস্থিতি


14

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

তাহলে কিছু বাস্তব-বিশ্বের পরিস্থিতি কী যেখানে আমি protectedসি ++ কোডে পদ্ধতিগুলি ব্যবহার করতে চাই ?

(দ্রষ্টব্য যে আমি সাধারণভাবে প্রয়োগের উত্তরাধিকার সম্পর্কে খুব বেশি পছন্দ করি না, এটি অনেক কিছু ব্যাখ্যা করতে পারে ...)

উত্তর:


12

এখানে একটি উদাহরণ

class Base {
public:
  // other members ...

protected:
  ~Base() { }
};

অ-পলিমারফিক বেস ক্লাস হিসাবে ব্যবহৃত হয়। তবে ব্যবহারকারীদের delete baseptr;এটির কল করতে দেওয়া হবে না কারণ ধ্বংসকারী অ্যাক্সেসযোগ্য। যেহেতু এর কোনও ভার্চুয়াল ডেস্ট্রাক্টর নেই, তাই লোকেদের এটি করার অনুমতি দেওয়া হবে অনির্ধারিত আচরণ। হার্ব দ্বারা "ভার্চুয়ালুটি" দেখুন ।


1
তোমরা কি করছ? কেন এই নিম্নমানের ছিল? এটা পুরোপুরি যুক্তিসঙ্গত। যদি আপনি এটি বুঝতে না পারেন, দয়া করে জিজ্ঞাসা করুন। আপনার যদি মনে হয় এটি ভুল হয়েছে, দয়া করে ব্যাখ্যা করুন। আমরা এখানে আপনার অন্তর্দৃষ্টি থেকে শিখতে।
এসবিআই

কেন -1? এই প্রথম জিনিসটি আমি ভেবেছিলাম।
GManNGG

1
কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরগুলি কেবলমাত্র আমি দেখেছি ব্যবহার সম্পর্কে। নোট করুন যে সিসিটি এখনও একটি সতর্কতা প্রকাশ করে যে ডেস্ট্রাক্টর এটির উপর ভার্চুয়াল is
ম্যাথিউ এম।

+1 আমি কয়েকটি বইয়ের পরামর্শ প্রয়োগ করতে সুরক্ষিত পদ্ধতিও ব্যবহার করি: পাবলিক ভার্চুয়াল ফাংশনগুলির পরিবর্তে সুরক্ষিত ভার্চুয়াল ফাংশনগুলির সাথে একটি সার্বজনিক ইন্টারফেস রাখি।
ক্লাইম

3

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

এছাড়াও, আপনি যদি টেম্পলেট প্যাটার্নটি ব্যবহার করেন এবং বেস ক্লাসে আপনার প্রাক বা পোস্ট এক্সিকিউটিভ পদ্ধতি থাকে তবে আপনি ওভাররাইড পদ্ধতি থেকে বেস বাস্তবায়নটি কল করতে চাইতে পারেন। যদি বেসটি কেবল ব্যক্তিগত হয় (এবং এখনও সি ++ তে ওভাররাইট করা যায়), আপনি ওভাররাইড পদ্ধতি থেকে বেস প্রয়োগটি কল করতে সক্ষম হবেন না।


1
বেস ক্লাসের পদ্ধতিগুলি কল না করার বিষয়ে কি টেম্পলেট প্যাটার্নটি নয় ?
এসবিআই

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

1

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

class Base
{
private:
    bool m_bInitialized;
public:
    virtual void Initialize() = 0;

    void setInitialized() { m_bInitialized = true; };
    bool isInitialized() const { return m_bInitialized; };
}; // eo class Base

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

class Base
{
private: 
    bool m_bInitialized;

protected:
    virtual void InitializeImpl() = 0;

public:

    void Initialize()
    {
        InitializeImpl();
        m_bInitialized = true;
    }; // eo Initialize

    bool isInitialized() const { return m_bInitialized; };
}; // eo class Base

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


0

অন্যান্য অনেক বৈশিষ্ট্য হিসাবে, protectedআপনাকে কিছুটা প্রসারিত এনক্যাপসুলেশন ভাঙ্গতে দেয়। খাঁটি ওও ধারণাগুলি ভাঙ্গা সাধারণত বিভিন্ন কারণে করা হয়

  1. উন্নত পারফরম্যান্স অর্জন (চিন্তা করুন inline),
  2. কোডটি বোঝার পক্ষে সহজ করে তোলে এবং,
  3. আরও ভাল এনক্যাপসুলেশন ( friendআপনাকে কিছু বন্ধু শ্রেণীর সদস্যদের অ্যাক্সেস সীমাবদ্ধ করতে দেয়)

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

একটি ক্ষেত্রে যেখানে আমি এটি ব্যবহার করেছি তা হ'ল একটি শ্রেণীর সমস্ত কনস্ট্রাক্টর তৈরি করা protected, মূলত সেই শ্রেণিকে বিমূর্ত করে তোলা (আপনি কোনও উদ্ভূত শ্রেণীর কোনও অবজেক্টের উপ-অবজেক্ট ছাড়া এটি ইনস্ট্যান্ট করতে পারবেন না)।


0

সম্ভবত এটি খারাপ নকশা ছিল, তবে আমার কাছে এটির মতো কিছু ছিল:

// much simplified, of course
class input_device // base class
{
public:
    virtual ~input_device() {}

    // normally would be private with public caller, etc.
    virtual void update() = 0; 

    template <typename Func>
    void register_callback(Func func)
    {
        mButtonPressSignal.connect(func);
    }

protected:
    void trigger_signal(unsigned button)
    {
        mButtonPressSignal(button);
    }

private:
    boost::signals2::signal<void(unsigned)> mButtonPressSignal;
};

উত্পন্ন ক্লাসগুলি, update()কল করে সংকেতকে ট্রিগার করতে পারে trigger_signal()। কিন্তু সিগন্যালটি দিয়ে তাদের সক্ষম হওয়া উচিত বলেই এই সংকেতটি ব্যক্তিগতভাবেই রেখে দেওয়া হয়েছিল। ট্রিগার ফাংশনটি সুরক্ষিত করা হয়েছিল কারণ কেবল উদ্ভূত শ্রেণীরাই এটি ট্রিগার করতে সক্ষম হওয়া উচিত, কিছুই নয়।


0

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

// burguers.hpp

class BurguerClass {
  private: void addSecretRecipeSauce();  

  protected: virtual void addBread();  
  protected: virtual void addSalad();  
  protected: virtual void addMeat();
  protected: virtual void addExtraIngredients();

  public: virtual void makeBurguer();  
}

class CheeseBurguerClass: public BurguerClass {
  protected: override void addBread();  
  protected: override void addSalad();  
  protected: override void addMeat();
  protected: override void addExtraIngredients();

  protected: virtual void addCheese();

  public: override void makeBurguer();
}

class RanchStyleBurguerClass: public BurguerClass {
  protected: override void addBread();  
  protected: override void addSalad();  
  protected: override void addMeat();
  protected: override void addExtraIngredients();

  public: override void makeBurguer();
}

class EastCoastVegetarianStyleBurguerClass: public BurguerClass {
  protected: override void addBread();  
  protected: override void addSalad();  
  protected: override void addMeat();
  protected: override void addExtraIngredients();

  public: override void makeBurguer();
}

সুতরাং, আপনার ফাস্ট ফুড রেস্তোঁরায় একটি নতুন কুক (বিকাশকারী) উপস্থিত হয়েছে। আপনি এটি শেখান, আপনি বার্গারগুলি (জনসাধারণের পদ্ধতি) বিক্রি করেন, কীভাবে বার্গারগুলি প্রস্তুত করবেন (সুরক্ষিত পদ্ধতি), তবে "পেটেন্টেড" গোপন রেসিপি সসটি নিজের কাছে রাখুন।

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