আড়াল করার ক্ষেত্রে সি # তে "নতুন" সংশোধকটির ব্যবহারিক ব্যবহারগুলি কী কী?


21

একজন সহকর্মী এবং আমি newসি # তে কীওয়ার্ডটির আচরণের দিকে নজর দিচ্ছিলাম কারণ এটি লুকানোর ধারণার ক্ষেত্রে প্রযোজ্য। ডকুমেন্টেশন থেকে :

বেস ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত সদস্যকে স্পষ্টভাবে আড়াল করতে নতুন সংশোধক ব্যবহার করুন। উত্তরাধিকার সূত্রে প্রাপ্ত সদস্যকে আড়াল করতে, একই নামটি ব্যবহার করে উদ্ভূত শ্রেণিতে ঘোষণা করুন এবং নতুন সংশোধক দিয়ে এটি সংশোধন করুন।

আমরা ডকুমেন্টেশনটি পড়েছি এবং আমরা বুঝতে পারি যে এটি মূলত কী করে এবং এটি কীভাবে তা করে। আমরা সত্যিই যেটি হ্যান্ডেলটি পেতে পারি না তা হ'ল আপনাকে প্রথমে এটি করার দরকার কেন। সংশোধকটি ২০০৩ সাল থেকে রয়েছে এবং আমরা দুজনেই .Net এর সাথে আরও দীর্ঘ সময় ধরে কাজ করছি এবং এটি কখনই সামনে আসে না।

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

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


9
হতে পারে আপনি এটা খুব পড়েছি, কিন্তু কেন পদ্ধতি গোপন সি # যোগ করা হয়েছিল উপর এরিক Lippert (গ # কম্পাইলার ডেভেলপার) থেকে একটি আকর্ষণীয় নিবন্ধ: blogs.msdn.com/b/ericlippert/archive/2008/05/21/... । এটি আপনার প্রশ্নের অংশের উত্তর দেয়, তবে আপনার জন্য আমার কাছে কোনও ব্যবসায়ের মামলা প্রস্তুত নেই তাই আমি এটি একটি মন্তব্যে রেখেছি।
জালান

3
@ জালেন: ব্যবসায়ের কেসটি এই পোস্টে আলোচিত হয়েছে: ব্লগস.এমএসএনএন
ব্রায়ান

উত্তর:


22

আপনি এটি রিটার্ন টাইপের সম্প্রচার অনুকরণ করতে ব্যবহার করতে পারেন। এরিক লিপার্টের ব্যাখ্যা । এরিক এই উদাহরণ কোড সরবরাহ করে:

abstract class Enclosure
{
    protected abstract Animal GetContents();
    public Animal Contents() { return this.GetContents(); }
}
class Aquarium : Enclosure
{
    public new Fish Contents() { ... }
    protected override Animal GetContents() { return this.Contents(); }
}

এটি একটি চারপাশের কাজ। public override Fish Contents() { ... }নিরাপদ থাকা সত্ত্বেও আইনী নয়।

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

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

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

এই পরিস্থিতিটি বিস্তারিত পোস্ট করা হয়েছে এরিক লিপার্টের এই পোস্টে


1
new"এটি ভয়ঙ্কর এবং বিভ্রান্তিকর" এর চিহ্নিতকারী হওয়ার জন্য +1 ।
অব্নার শাহর-কাশতান

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

4

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

এখন, এটি সম্ভবত ততটা কার্যকর নয় unsafeতবে একবার আপনি যদি কোনও ভাষা নিয়ে যান তবে কোনও ভাষার অনুমান থেকে বেরিয়ে আসা শক্ত।


5
জাভাতে নতুন নেই কারণ জাভা সমস্ত পদ্ধতিকে ভার্চুয়াল হিসাবে বিবেচনা করে। এরিক লিপার্টের মতে, নতুনকে সমর্থন করার প্রেরণা হ'ল ভঙ্গুর বেস শ্রেণির সমস্যা সমাধান করা। কেবলমাত্র নিম্ন-স্তরের গ্রন্থাগার ব্যবহারের জন্য নয়, বাস্তব-বিশ্ব ব্যবসায়িক ব্যবহারের জন্য নতুন অস্তিত্ব প্রয়োজনীয়। জাভাতে নতুন না থাকার (এবং অ-ভার্চুয়াল পদ্ধতি না থাকা) এর অর্থ হ'ল যদি কোনও বেস ক্লাস একটি নতুন পদ্ধতি প্রবর্তন করে যা ইতিমধ্যে উদ্ভূত শ্রেণীর মধ্যে ব্যবহার করা হয় তবে বিদ্যমান কোডটি ভেঙে যেতে পারে, এই সত্যটি সত্ত্বেও যে বেস শ্রেণীর বিকাশকারীকে অনুমতি দেওয়া উচিত এটি গ্রহণ করে এমন কোড সম্পর্কে অজ্ঞতাবশত হওয়া।
ব্রায়ান

3

এটি পাঠককে বলছে যে "আমি ইচ্ছাকৃতভাবে বেস ক্লাসটি 'এই পদ্ধতির প্রয়োগ" গোপন করেছিলাম, দুর্ঘটনাক্রমে বিপরীতে।


5
এই প্রশ্ন ভিক্ষা হিসাবে আমাকে আঘাত। ওপি এটি কী করে তা জানে তবে কেন জানতে চায়।
ব্রায়ান

0

আপনি আগের সদস্যটি অন্য নামের মাধ্যমে উপলভ্য করতে চাইতে পারেন:

class VehicleClass
{
  public int AnyProperty
  {
    get; set;
  }

  public int AnyFunction() { return 0; }
} // VehicleClass

class IntermediateClass : VehicleClass
{
  public int PreviousAnyProperty
  {
    get { return AnyProperty; }
    set { AnyProperty = value  }
  }

  public int PreviousAnyFunction() { return AnyFunction(); }
} // IntermediateClass 

class CarClass : IntermediateClass
{
  public new int AnyProperty
  {
    get ; set ;
  }

  public new int AnyFunction() { return 5; }
} // class CarClass

class ExampleClass
{

  public static void Main()
  {
    using (CarClass MyCar = new CarClass())
    {
      int AnyInt1 = MyCar.PreviousAnyProperty;
      MyCar.PreviousAnyProperty = 7;

      int AnyInt2 = MyCar.PreviousAnyFunction();

      int AnyInt3 = MyCar.AnyProperty;
      MyCar.AnyProperty = 45;

      int AnyInt4 = MyCar.AnyFunction();
    }
  } // static void Main()

} // class CarClass

চিয়ার্স।


এটি কীভাবে কাজ করে আমি তার সাথে পরিচিত, তবে আমার প্রশ্নটি সত্যই এই যে আপনি আগের সদস্যটিকে অন্য নামের মাধ্যমে কেন পেতে চান? এটি সমস্ত ধরণের চুক্তিগুলি ভঙ্গ করে, কিছু জেনেরিক টুকরোটিকে অকেজো করে।
জোয়েল ইথারটন

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

0

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

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