কোনও ওও ভাষাগুলি কি ওভারডিডেন পদ্ধতিটি বেসকে কল করবে তার গ্যারান্টি দেওয়ার কোনও প্রক্রিয়া সমর্থন করে?


12

আমি মনে করি এটি একটি দরকারী ভাষার বৈশিষ্ট্য হতে পারে এবং ভাবছিল যে কোনও ভাষা ইতিমধ্যে এটি সমর্থন করে কিনা।

আপনার যদি ধারণাটি থাকে তবে:

class C
  virtual F
     statement1
     statement2

এবং

class D inherits C
  override F
     statement1
     statement2
     C.F()

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


উত্তর:


14

হ্যাঁ তারা করে. একে ওওর স্ক্যান্ডিনেভিয়ান মডেল বলা হয়, এটি সিমুলায় উদাহরণস্বরূপ ব্যবহৃত হয় (অন্যান্য ওও মডেল যা বিস্তৃত এবং এখন মঞ্জুর হিসাবে গ্রহণ করা হয় আমেরিকান মডেল)। স্ক্যান্ডিনেভিয়ার মডেলটিতে আপনি ওভাররাইড করছেন না, তবে সাব-আচরণ সরবরাহ করছেন।

সুপারক্লাসের পদ্ধতিতে:

some-code-before
INNER // this is the actual Simula keyword
some-code-after

সাবক্লাসের পদ্ধতিতে:

some-code-in-subclass

আপনি সুপারক্লাস 'দৃষ্টান্ত' পদ্ধতি foo বিন্যাস কল, তাহলে শুধুমাত্র some-code-beforeএবং some-code-afterঘটবে ( INNERকিছুই না), কিন্তু যদি আপনি উপশ্রেণী 'দৃষ্টান্ত' foo বিন্যাস কল, এটা আছে some-code-before, some-code-in-subclassএবং তারপর some-code-after


9

ওভাররাইড পদ্ধতিতে কল করার জন্য আমি কোন ভাষা জানি না for প্রকৃতপক্ষে, কিছু ভাষা ওভাররাইডিং পদ্ধতিগুলিকে মঞ্জুরি দেয় যা ওভাররাইডযোগ্য নয় (যেমন newসি # তে কীওয়ার্ড ব্যবহার করে )। তবে এটি কাছে যাওয়ার দুটি উপায় রয়েছে।

প্রথমটি হ'ল একটি অলঙ্ঘনযোগ্য পদ্ধতি তৈরি করা (যেমন virtualসি # তে কীওয়ার্ডের অভাব রয়েছে এমন একটি বা finalজাভাতে কীওয়ার্ড রয়েছে এমন একটি) যা একটি ওভারাইডেবলকে কল করে যা শ্রেণীর বাইরে থেকে কল করা যায় না (যেমন protectedসি #, জাভা বা সি ++ তে)।

class C
  A
     statement1
     F
     statement3

  protected virtual F
     statement2

এবং

class D inherits C

  protected override F
     statement4
     C.F()

ওভাররাইডিং ক্লাসগুলি ওভাররাইড এবং এর আচরণটি পরিবর্তন Cকরতে বিনামূল্যে Fতবে শ্রেণীর বাইরের কলাররা কেবল এটির মাধ্যমে অ্যাক্সেস করে A

সম্পাদনা: অন্যরা যেমন উল্লেখ করেছে, একে টেম্পলেট পদ্ধতি প্যাটার্ন বলা হয় ।

দ্বিতীয় উপায়টি হ'ল এমন একটি ভাষা ব্যবহার করুন যা বেস ক্লাসে নির্দিষ্ট পূর্ব শর্তাদি এবং পোস্টকন্ডিশনগুলি প্রয়োগ করে, কোড চুক্তি সহ আইফেল বা সি # এর মতো। এটি বেস শ্রেণিকে কল করতে বাধ্য করবে না তবে ওভাররাইড পদ্ধতিতে একই বক্তব্য সম্পাদন করতে বাধ্য করা যেতে পারে। ভাষা দিকগুলি উত্তরাধিকারসূত্রে প্রাপ্ত হতে দেয় যদি দিকগুলি ব্যবহার করাও সহায়তা করতে পারে।


2
আপনি এমনকি privateসি ++ তে পদ্ধতিটিকে ওভাররাইড করার জন্য করতে পারেন :) ভেষজ সুটার এটি এখানে বিশদভাবে ব্যাখ্যা করে ।
ফ্রেডওভারফ্লো

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

7

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


6

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

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

class super {
  public final void doSomething() {
    doSpecialthing();
    doMore();
  }
  public void doSpecialthing() {
  }
}

ওভাররাইড পদ্ধতিতে কলটির অবস্থানের উপর নির্ভর করে এটি মৃত্যুদন্ড কার্যকর করার ক্রমটি নির্ধারণ করতে দেয়, যা সাধারণ সুপার কল সহ সাবক্লাস প্রয়োগকারীটির ইচ্ছায় থাকে।


1

আমি যে নিকটতম প্যাটার্নটির কথা ভাবতে পারি তা হ'ল স্ব-সাবস্ক্রাইব করা ইভেন্ট। এটি কিছুটা জটিল, এবং কোডারের পক্ষে মোটেই স্বজ্ঞাত নয়, তবে লক্ষ্যটি অর্জন করে।

class C
{
    public void F()
    {
        ...
        OnF()
    }

    protected event OnF
}

class D : C
{
    public D()
    {
        base.OnF += this.F
    }

    private void F
    {
        ...
    }
}

1
এটি মোটামুটি সাধারণ ডিজাইনের প্যাটার্ন, কখনও কখনও প্রো এবং পোস্ট উভয়ই ওভাররাইড যেমন। ভিউউইল অ্যাপয়ার (), ভিউডিডঅ্যাপার ()। আদর্শ যখন আপনি সাবক্লাসগুলি ডিফল্ট আচরণের পরিবর্তনের (পরিবর্তিত পরিবর্তে) মঞ্জুরি দিতে চান want
ক্রিস ভ্যান বেল

1

লিস্প মেশিন "স্বাদ" উত্তরাধিকারসূত্রে প্রাপ্ত মূল পদ্ধতি "পরে" "পরে" এবং "কাছাকাছি" টাইপযুক্ত পদ্ধতিগুলিকে মঞ্জুরি দেয়।


0

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

class D inherits C
    override F
        statement1
        statement2
        G()
    G
        statement3
        C.F()
        statement4

আপনার দৃশ্যকল্প অধীনে, আমি কল্পনা কম্পাইলার পতাকা বাস্তবায়ন would Fমধ্যে D, যদিও এটা আছে (পরোক্ষভাবে) কলের C.F()

মূলত, আপনি যা বর্ণনা করেছেন তা হ'ল উত্তরাধিকার সূত্রে উত্তরাধিকারসূত্রে প্রাপ্ত ক্লাসগুলির চুক্তি Cলঙ্ঘন করা হলে সংকলকটিকে সনাক্ত করতে সহায়তা করার একটি সম্ভাব্য প্রক্রিয়া । আমার বক্তব্যটি হ'ল, যদিও এটি দুর্দান্ত জিনিস, আমি কীভাবে আমার সাবক্লাসটি বাস্তবায়ন করতে পারি তা সীমাবদ্ধ করে ব্যয় করা উচিত নয় ।


1
-1: আপনি এমন পরিস্থিতিটি ভাবতে সক্ষম হচ্ছেন যেখানে আপনি যে ব্যবহার করতে চাইবেন না সেই প্রশ্নের উত্তর নয় "" কোনও ভাষা এটির অনুমতি দেয় "?

@ গ্রাহামলি: খুব সত্য। আমার বক্তব্যটি হ'ল কোনও ভাষা কেন (যে সম্পর্কে আমি সচেতন) এই জাতীয় বৈশিষ্ট্যটি প্রয়োগ করে না তার একটি কারণ ব্যাখ্যা করার চেষ্টা করছিলাম। আমি অনুমান করি যে এটি ব্যাখ্যা করতে আমি এতটা আটকে গেলাম যে আমি কেন এটি ব্যাখ্যা করছি তা উল্লেখ করতে ভুলে গিয়েছিলাম । -1 আনন্দের সাথে গ্রহণ। :)
ম্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.