জিরাফ কখন জিরাফ হয় না?


23

আমি আশা করি এই ধরণের "ধাঁধা" প্রোগ্রামিং ধাঁধা এবং কোড গল্ফে অনটপিক।

নীচের সি # পদ্ধতিটি ফিরে আসেfalse এমন একটি পরিস্থিতির উদাহরণ দিন :

public class Giraffe : Animal
{
  public bool Test()
  {
    return this is Giraffe;
  }
}

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


2
"পদ্ধতিটিকে বলা হয়" দ্বারা, আপনি কি বলতে চাইছেন যে এটি Giraffe giraffe = new Giraffe(); giraffe.Test(); অবশ্যই কোনওভাবে ঘটতে হবে যাতে সেই পদ্ধতির লাইনটি আসলে বাস্তবায়িত হয়?
জেসি সি স্লিকার 15

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

1
ঠিক আছে, আমার সহজ সমাধানটি দেখতে আরও ভাল লাগে Animal giraffe = new Giraffe(); giraffe.Test();এবং পিতামাত্ত শ্রেণীর Animalএকটি Test()পদ্ধতি রয়েছে যা প্রত্যাবর্তন করে false। এটি কিছুটা প্রতারণা করছে কারণ এটি পিতামাতার ক্লাস পদ্ধতিটি না বলে Giraffe। তবে কল সাইটটি দেখতে একই রকম।
জেসি সি স্লিকার 15

@ জেসিসি.স্লাইকার আহ, আমি দেখছি। আমি যুক্তি দিয়ে বলব যে আপনার "সমাধান" দিয়ে এটি "নীচের পদ্ধতি" নয় (যেমন এটি আমার সমস্যায় বলা আছে) যেটি ফিরে আসে false, তাই আমি বলব না এটি একটি সম্পূর্ণ সমাধান ছিল। কিন্তু আকর্ষণীয় এখনও। আমার সমাধানের কোনও পদ্ধতি হিডিং (ইঙ্গিত) নেই, তবে যেমনটি আমি বলেছিলাম, অন্যান্য সমাধানগুলিও আকর্ষণীয় হতে পারে।
জেপ্পে স্টিগ নীলসন

উত্তর:


28

হ্যাঁ, খুঁজে পেয়েছি!

public class Animal
{
    public class Giraffe { } // 1
}
public class Giraffe : Animal // 2
{
    public bool Test()
    {
        return this is Giraffe;
    }
}

যেহেতু Giraffe 1একজন সদস্য Animal, এবং Giraffe 2এক স্তর আরও বাইরে, নাম Giraffeমধ্যে isপরীক্ষা (গ # 5 বৈশিষ্ট অধ্যায় 7.6.2) সাবেক বোঝায়।

ভিজ্যুয়াল স্টুডিও এর জন্য একটি সতর্কতা দেখায় this is Giraffe:

প্রদত্ত এক্সপ্রেশন কখনই সরবরাহিত ধরণের হয় না

যা স্পষ্টতই সত্য, যেহেতু এটি সম্পূর্ণ বিষয় :)

আপনি Giraffe 1সরাসরি ভিতরে রাখতে পারবেন না Giraffe 2, কারণ

সদস্যের নামগুলি তাদের ঘেরের ধরণের মতো হতে পারে না

- তবে উদ্ভূত শ্রেণীর জন্য এ জাতীয় নিয়ম নেই।

ঝরঝরে সমস্যা, আমাকে কিছুক্ষণ সময় লাগল।


11
স্যার ভাল খেলেছেন
মার্ক গ্র্যাভেল

2
হ্যাঁ, আমার মনে এই সমাধানটি ছিল! সুতরাং দুটি প্রকার রয়েছে, একটি নেস্টেড TheNamespace.Animal.Giraffeযা উত্তরাধিকারের কারণেও বলা যেতে পারে TheNamespace.Giraffe.Giraffe, এবং একটি অনাবৃত TheNamespace.Giraffe। সি # স্পেসে আপনার রেফারেন্স প্রাসঙ্গিক! আপনি সংকলক সতর্কতা থেকে মুক্তি পেতে পারেন। বেস ক্লাসের নেস্টেড টাইপটি থেকে বদলে classনিন interface। সেক্ষেত্রে কেউ হয়ত অনিরাপদ থেকে আরও কিছু পেতে পারে Giraffe এবং নীড়গুলিও কার্যকর করে দিতে Giraffeপারে, সেই ক্ষেত্রে সংকলক অভিযোগ করতে পারে না; এটি একটি "ন্যায্য" ধরণের চেক।
জেপ্প স্টিগ নীলসন

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