এই স্পার্টা, নাকি?


121

নীচে একটি সাক্ষাত্কার প্রশ্ন। আমি একটি সমাধান নিয়ে এসেছি, তবে কেন এটি কার্যকর তা নিশ্চিত নয় not


প্রশ্ন:

Spartaক্লাসটি পরিবর্তন না করে কিছু কোড লিখুন যা MakeItReturnFalseপ্রত্যাবর্তন করে false

public class Sparta : Place
{
    public bool MakeItReturnFalse()
    {
        return this is Sparta;
    }
}

আমার সমাধান: (স্পিকার)

public class Place
{
public interface Sparta { }
}

কিন্তু কেন নেই SpartaMakeItReturnFalse()পড়ুন {namespace}.Place.Spartaপরিবর্তে {namespace}.Sparta?


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

1
আমি প্রথমে স্পয়লার ট্যাগগুলি অন্তর্ভুক্ত করেছি, তবে এই পোস্টটির জীবদ্দশায় এটি সম্প্রদায়টি একাধিকবার সম্পাদনা করেছিল। এর জন্যে দুঃখিত.
বুড়ি ২

1
আমি এই পোস্টের শিরোনাম অপছন্দ করি; এটি কোডগলফ.এসইয়ের জন্য আরও ফিট। আমরা কি এমন কিছুতে পরিবর্তন করতে পারি যা প্রকৃতপক্ষে প্রশ্নটি বর্ণনা করে?
সুপুস্তর

3
সুন্দর ধাঁধা ভয়াবহ সাক্ষাত্কারের প্রশ্ন, তবে সুন্দর ধাঁধা। এটি কীভাবে এবং কেন কাজ করে তা আপনি জানেন এখনই আপনার আরও শক্তিশালী সংস্করণটি নেওয়া উচিত: stackoverflow.com/q/41319962/88656
এরিক লিপার্ট

উত্তর:


117

কিন্তু কেন নেই SpartaMakeItReturnFalse()পড়ুন {namespace}.Place.Spartaপরিবর্তে {namespace}.Sparta?

মূলত, কারণ নাম অনুসন্ধানের বিধিগুলি তাই বলে। সি # 5 স্পেসিফিকেশনে, সম্পর্কিত নামকরণের নিয়মগুলি বিভাগে 3.8 ("নামস্থান এবং টাইপের নাম") এর মধ্যে রয়েছে।

বুলেটগুলির প্রথম দম্পতি - ছাঁটা এবং টীকাযুক্ত - পড়ুন:

  • যদি নেমস্পেস-বা-টাইপ-নামটি ফর্মের Iবা ফর্মের হয় I<A1, ..., AK> [সুতরাং আমাদের ক্ষেত্রে কে = 0] :
    • যদি কে শূন্য হয় এবং জেনেরিক পদ্ধতি ঘোষণার মধ্যে নেমস্পেস-বা-টাইপ-নাম উপস্থিত হয় [না, কোনও জেনেরিক পদ্ধতি নেই]
    • অন্যথায়, যদি নামের স্থান-বা-টাইপ-নাম কোনও প্রকার ঘোষণার মধ্যে উপস্থিত হয়, তবে প্রতিটি উদাহরণের জন্য টি (§10.3.1) টাইপ করুন, প্রকারের ঘোষণার উদাহরণ টাইপ দিয়ে শুরু করুন এবং প্রতিটি সংলগ্ন শ্রেণীর উদাহরণ টাইপ দিয়ে চালিয়ে যান বা কাঠামো ঘোষণা (যদি থাকে):
      • যদি Kশূন্য হয় এবং এর ঘোষণায় Tনামের সাথে কোনও প্রকারের প্যারামিটার অন্তর্ভুক্ত থাকে I, তবে নেমস্পেস-বা-টাইপ-নাম সেই ধরণের পরামিতিকে বোঝায়। [নাঃ]
      • অন্যথায়, যদি নাম ঘোষণার প্রকারের শিরোনামের মধ্যে নেমস্পেস-বা-টাইপ-নাম উপস্থিত হয়, এবং T বা এর কোনও বেস ধরণের কোনও নেস্টেড অ্যাক্সেসযোগ্য প্রকার থাকে যার নাম Iএবং Kপ্রকারের প্যারামিটার থাকে তবে নামস্থান-বা-টাইপ-নামটি সেইটিকে বোঝায় প্রদত্ত প্রকারের আর্গুমেন্ট দিয়ে টাইপ করুন। [বিঙ্গো!]
  • পূর্ববর্তী পদক্ষেপগুলি যদি ব্যর্থ হয় তবে প্রতিটি নেমস্পেসের জন্য N, নেমস্পেস-বা-টাইপ-নামটি যে নেমস্পেসের সাথে শুরু হয়, প্রতিটি সংলগ্ন নেমস্পেস (যদি থাকে) দিয়ে চালিয়ে যাওয়া এবং বিশ্বব্যাপী নেমস্পেসের সাথে সমাপ্ত হয়, নিম্নলিখিত পদক্ষেপগুলি মূল্যায়ন করা হয় একটি সত্তা অবস্থিত না হওয়া পর্যন্ত:
    • যদি Kশূন্য হয় এবং Iএকটি নামস্থান নাম N, তারপর ... [হ্যাঁ, যে হবে সফল]

সুতরাং চূড়ান্ত বুলেট পয়েন্টটি প্রথম বুলেটটি যদি কিছু না পায় তবে Sparta ক্লাসটি কী তা গ্রহণ করবে ... তবে যখন বেস শ্রেণি Placeএকটি ইন্টারফেস সংজ্ঞায়িত Spartaকরে, তখন আমরা Spartaশ্রেণীর বিবেচনা করার আগে এটি পাওয়া যায় ।

মনে রাখবেন যে আপনি যদি Place.Spartaইন্টারফেসের পরিবর্তে নেস্টেড টাইপ করে একটি ক্লাস করেন তবে এটি এখনও সংকলন করে এবং ফিরে আসে false- তবে সংকলকটি একটি সতর্কতা জারি করে কারণ এটি জানে যে কোনও উদাহরণ Spartaকখনই শ্রেণীর উদাহরণ হতে পারে না Place.Sparta। তেমনিভাবে যদি আপনি Place.Spartaকোনও ইন্টারফেস রাখেন তবে Spartaক্লাস তৈরি করেন তবে sealedআপনি একটি সতর্কতা পাবেন কারণ কোনও Spartaইন্টারফেস কখনও প্রয়োগ করতে পারে নি could


2
অন্য এলোমেলো পর্যবেক্ষণ: আসল Spartaবর্গ ব্যবহার করে , this is Placeফেরত দেয় true। যাইহোক, যোগ public interface Place { }করতে Spartaবর্গ ঘটায় this is Placeরিটার্ন false। আমার মাথা স্পিন করে তোলে
বুড়ি

@ বুডি: ঠিক আছে, কারণ আবার, আগের বুলেটটি Placeইন্টারফেস হিসাবে সন্ধান করে।
জন স্কিটি

22

কোনও নামটির মানকে সমাধান করার সময় সংজ্ঞাটি সমাধানের জন্য সংজ্ঞাটির "ঘনিষ্ঠতা" ব্যবহার করা হয়। "নিকটতম" যাই হোক না কেন সংজ্ঞাটি বেছে নেওয়া হয়।

ইন্টারফেসটি Spartaএকটি বেস শ্রেণীর মধ্যে সংজ্ঞায়িত করা হয়। ক্লাসটি Spartaসংবলিত নেমস্পেসে সংজ্ঞায়িত করা হয়েছে। বেস শ্রেণীর মধ্যে সংজ্ঞায়িত জিনিসগুলি একই নামস্থানে সংজ্ঞায়িত জিনিসগুলির চেয়ে "কাছাকাছি" থাকে।


1
এবং ভাবুন যে নাম অনুসন্ধান এইভাবে কাজ না করে । তারপরে, কার্যকারী কোড যা একটি অভ্যন্তরীণ শ্রেণি ধারণ করে তা ভাঙা হয়ে যাবে যদি কেউ একই নামের সাথে শীর্ষ স্তরের শ্রেণি যুক্ত করে।
dan04

1
@ ডান04: তবে পরিবর্তে, কোনও নেস্টেড শ্রেণি না থাকা এমন ওয়ার্কিং কোডটি ভেঙে যায় যদি কেউ শীর্ষ স্তরের শ্রেণীর মতো একই নামের সাথে নেস্টেড শ্রেণি যুক্ত করে। সুতরাং এটি মোট "জয়ের" দৃশ্য নয়।
জন স্কেটি

1
@ জোনস্কিট আমি বলব যে এ জাতীয় নেস্ট ক্লাস যুক্ত করা এমন একটি অঞ্চলের পরিবর্তন যা ওয়ার্কিং কোডের দ্বারা যুক্ত হওয়ার যুক্তিসঙ্গত কারণ রয়েছে এবং পরিবর্তনগুলি লক্ষ্য রাখুন। সম্পূর্ণ সম্পর্কহীন শীর্ষ-স্তরের শ্রেণি যুক্ত করা আরও দূরে সরিয়ে ফেলা হয়।
অ্যাঞ্জু আর

2
@ জোনস্কিট কি কেবল ব্রিটল বেস ক্লাসের সমস্যাটি কিছুটা ভিন্ন ভঙ্গিতে নয়?
জোও মেন্ডেস

1
@ জোওমেনডেস: হ্যাঁ, বেশ।
জন স্কিটি

1

সুন্দর প্রশ্ন! যারা প্রতিদিন সি # করেন না তাদের জন্য আমি আরও দীর্ঘ ব্যাখ্যা যোগ করতে চাই ... কারণ প্রশ্নটি সাধারণত নাম রেজোলিউশন ইস্যুগুলির একটি ভাল অনুস্মারক।

মূল কোডটি নিন, নিম্নলিখিত উপায়ে কিছুটা সংশোধন করা হয়েছে:

  • আসল নামের (যেমন return this is Sparta) এর সাথে তুলনা করার পরিবর্তে প্রকারের নামগুলি মুদ্রণ করা যাক ।
  • ইন্টারফেস নাম রেজোলিউশন চিত্রিত Athenaকরতে Placeসুপারক্লাসে ইন্টারফেসটি সংজ্ঞায়িত করা যাক ।
  • ক্লাসে thisযেমন আবদ্ধ থাকে তেমন নামটি প্রিন্টও করি Sparta, কেবল সবকিছু খুব পরিষ্কার করে দেওয়া।

কোডটি এর মতো দেখাচ্ছে:

public class Place {
    public interface Athena { }
}

public class Sparta : Place
{
    public void printTypeOfThis()
    {
        Console.WriteLine (this.GetType().Name);
    }

    public void printTypeOfSparta()
    {
        Console.WriteLine (typeof(Sparta));
    }

    public void printTypeOfAthena()
    {
        Console.WriteLine (typeof(Athena));
    }
}

আমরা এখন একটি Spartaঅবজেক্ট তৈরি করি এবং তিনটি পদ্ধতি কল করি।

public static void Main(string[] args)
    {
        Sparta s = new Sparta();
        s.printTypeOfThis();
        s.printTypeOfSparta();
        s.printTypeOfAthena();
    }
}

আমরা যে আউটপুট পাই তা হ'ল:

Sparta
Athena
Place+Athena

তবে, আমরা যদি প্লেস ক্লাসটি সংশোধন করি এবং স্পার্টা ইন্টারফেসটি সংজ্ঞায়িত করি:

   public class Place {
        public interface Athena { }
        public interface Sparta { } 
    }

তারপরে এটি হ'ল Sparta- ইন্টারফেস - নামটি অনুসন্ধানের জন্য প্রথমে উপলব্ধ হবে এবং আমাদের কোডের আউটপুট এতে পরিবর্তিত হবে:

Sparta
Place+Sparta
Place+Athena

সুতরাং আমরা MakeItReturnFalseকার্যকারিতা সংজ্ঞা টাইপ তুলনা সঙ্গে কার্যকরভাবে গণ্ডগোল করেছি কেবল সুপারক্লাসে স্পার্টা ইন্টারফেসকে সংজ্ঞায়িত করে, যা নামটির রেজোলিউশনের মাধ্যমে প্রথম পাওয়া যায়।

তবে কেন নাম # রেজোলিউশনে সুপারক্লাসে সংজ্ঞায়িত ইন্টারফেসগুলিকে অগ্রাধিকার দিতে সি # বেছেছেন? @ জোনস্কিট জানেন! এবং আপনি যদি তার উত্তরটি পড়েন তবে আপনি সি # তে নাম রেজোলিউশন প্রোটোকলের বিশদ পাবেন।

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