বজ্রপাত এবং মেঘলা


88

আমি সি # (এবং ওওপি ) তে নতুন। আমার যখন নীচের মতো কিছু কোড থাকে:

class Employee
{
    // some code
}


class Manager : Employee
{
    //some code
}

প্রশ্ন 1 : আমার কাছে অন্য কোড রয়েছে যা এটি করে:

   Manager mgr = new Manager();
   Employee emp = (Employee)mgr;

এখানে Employeeএকটি Manager, তবে আমি যখন এটির মতো এটি ফেলে দিই তখন এর Employeeঅর্থ আমি এটি উপড়ে ফেলছি?

প্রশ্ন 2 :

যখন আমার বেশ কয়েকটি Employeeশ্রেণীর অবজেক্ট রয়েছে এবং কিছু রয়েছে তবে সেগুলি Managerসবকটিই নয়, আমি কীভাবে সম্ভব যেখানে তাদের ডাউনকাস্ট করতে পারি?


6
আপকাস্টিং সুস্পষ্ট কাস্ট ব্যতীত করা যেতে পারে। তাই Employee emp= mgr;যথেষ্ট করা উচিত।
আমার বগলে চুমু দাও

উত্তর:


95
  1. ঐটা ঠিক. যখন আপনি এটি করেন যে আপনি এটিকে কোনও employeeবস্তুতে কাস্ট করছেন তখন এর অর্থ আপনি কোনও নির্দিষ্ট পরিচালককে অ্যাক্সেস করতে পারবেন না।

  2. ডাউনকাস্টিং হ'ল যেখানে আপনি বেস ক্লাস নেন এবং তারপরে চেষ্টা করে আরও সুনির্দিষ্ট শ্রেণিতে পরিণত করেন। এটি ব্যবহার করে এবং এর মতো একটি সুস্পষ্ট কাস্ট ব্যবহার করে সম্পন্ন করা যায়:

    if (employee is Manager)
    {
        Manager m = (Manager)employee;
        //do something with it
    }
    

অথবা asঅপারেটরের সাথে এটির মতো:

Manager m = (employee as Manager);
if (m != null)
{
    //do something with it
}

যদি কিছু অস্পষ্ট থাকে তবে আমি এটি সংশোধন করতে পেরে খুশি হব!


ডাউনকাস্টিং কী তা জানতে আমার উদাহরণ দরকার?
ব্যবহারকারী 184805

4
সুপ্রতিষ্ঠিত শর্তাদি পুনরায় সংজ্ঞা দেওয়া থেকে বিরত থাকুন: "বক্সিং", ওওপি এবং সি # এর প্রসঙ্গে, এর অর্থ ভিন্ন কিছু (= কোনও মানের ধরণের অবজেক্টকে একটি রেফারেন্সে মোড়ানো)। এছাড়াও, আপনার উদাহরণটি কাস্টের পরে asঅপারেটরের পরিবর্তে (এবং হওয়া উচিত) ব্যবহার করতে পারে is
কনরাড রুডল্ফ

4
আমি প্রথম পয়েন্টে সংশোধন করে দাঁড়িয়েছি এবং এটি করার উভয় উপায় দেখানোর জন্য আমি আমার উত্তরটির দ্বিতীয়ার্ধটি পরিবর্তন করেছি।
আরসিআইএক্স

4
আপনার প্রথম বিবৃতি ("..." [কর্মচারী "বস্তুতে [ম্যানেজার বর্গের একটি উদাহরণ] ingালাই [..] এর অর্থ আপনি ম্যানেজার নির্দিষ্ট কিছুতেই অ্যাক্সেস করতে পারবেন না") পুরোপুরি সঠিক নয়। ও.পি.-এর উদাহরণে, যদি কর্মচারীর ভার্চুয়াল সদস্য থাকে যা ম্যানেজারে ওভাররাইড করা হয়, তবে সিএলআর কাস্টার সত্ত্বেও পরিচালককে ম্যানেজার বাস্তবায়ন কল করবে। সি # তে পলিমারফিজম সম্পর্কিত এমএসডিএন নিবন্ধ থেকে: "যখন একটি উদ্ভূত শ্রেণি ভার্চুয়াল সদস্যকে ওভাররাইড করে, তখনও সেই সদস্যটিকে বলা হয় এমনকি যখন শ্রেণীর কোনও উদাহরণ বেস শ্রেণীর উদাহরণ হিসাবে অ্যাক্সেস করা হয়।" এমএসডিএন প্রদত্ত উদাহরণটি প্রায় একই রকম।
অ্যান্টনি

49

আপকাস্টিং (ব্যবহার করা (Employee)someInstance) সাধারণত সহজ হয় কারণ সংকলক আপনাকে সংকলনের সময়ে বলতে পারে যে কোনও ধরণের অন্য কোনও থেকে উত্পন্ন হয়।

ডাউন কাস্টিং সাধারণত রান সময়ে করা উচিত কারণ সংকলক সর্বদা জানতে পারে না যে প্রশ্নে থাকা উদাহরণটি দেওয়া ধরণের is সি # এটির জন্য দুটি অপারেটর সরবরাহ করে - যা হ'ল ডাউনকাস্ট কাজ করে এবং সত্য / মিথ্যা প্রত্যাবর্তন করে তা আপনাকে বলে। আর যেমন যা প্রচেষ্টা ঢালাই এবং সঠিক টাইপ সম্ভব হলে, অথবা নাল যদি না ফেরৎ করতে।

কোনও কর্মচারী যদি পরিচালক হন তবে তা পরীক্ষা করতে:

Employee m = new Manager();
Employee e = new Employee();

if(m is Manager) Console.WriteLine("m is a manager");
if(e is Manager) Console.WriteLine("e is a manager");

আপনি এটি ব্যবহার করতে পারেন

Employee someEmployee = e  as Manager;
    if(someEmployee  != null) Console.WriteLine("someEmployee (e) is a manager");

Employee someEmployee = m  as Manager;
    if(someEmployee  != null) Console.WriteLine("someEmployee (m) is a manager");

11
  • আপকাস্টিং একটি অপারেশন যা একটি সাবক্লাস রেফারেন্স থেকে বেস ক্লাসের রেফারেন্স তৈরি করে। (সাবক্লাস -> সুপারক্লাস) (যেমন ম্যানেজার -> কর্মচারী)
  • ডাউনকাস্টিং এমন একটি অপারেশন যা বেস ক্লাসের রেফারেন্স থেকে একটি সাবক্লাস রেফারেন্স তৈরি করে। (সুপারক্লাস -> সাবক্লাস) (যেমন কর্মচারী -> পরিচালক)

তোমার ক্ষেত্রে

Employee emp = (Employee)mgr; //mgr is Manager

আপনি একটি উজান করছেন।

একটি upCast সবসময় একটি হতাশ যে একটি সুনির্দিষ্ট ঢালাই প্রয়োজন কারণ এটি সম্ভাব্য রানটাইম এ ব্যর্থ হতে পারে অসদৃশ সফল। ( InvalidCastException )।

সি # এই ব্যতিক্রমটি ছুঁড়ে ফেলা এড়াতে দুটি অপারেটর প্রস্তাব করে:

থেকে শুরু করে:

Employee e = new Employee();

প্রথম:

Manager m = e as Manager; // if downcast fails m is null; no exception thrown

দ্বিতীয়:

if (e is Manager){...} // the predicate is false if the downcast is not possible 

সতর্কতা : আপনি যখন কোনও উজান করেন তখন আপনি কেবল সুপারক্লাসের পদ্ধতি, বৈশিষ্ট্য ইত্যাদিতে অ্যাক্সেস করতে পারেন ...


6

আপনি যদি প্রতিটি কর্মচারী বস্তু এটি ম্যানেজার অবজেক্ট কিনা তা পরীক্ষা করতে হবে, অফ টাইপ পদ্ধতিটি ব্যবহার করুন:

List<Employee> employees = new List<Employee>();

//Code to add some Employee or Manager objects..

var onlyManagers = employees.OfType<Manager>();

foreach (Manager m in onlyManagers) {
  // Do Manager specific thing..
}

2

উত্তর 1: হ্যাঁ এটিকে আপকাস্টিং বলা হয়েছে তবে আপনি যেভাবে এটি করেন তা আধুনিক উপায় নয়। আপকাস্টিং সুস্পষ্টভাবে সম্পাদন করা যেতে পারে আপনার কোনও রূপান্তর দরকার নেই। সুতরাং শুধু কর্মচারী লিখি = এমজিআর; উজানের জন্য যথেষ্ট।

উত্তর 2: আপনি যদি ম্যানেজার শ্রেণীর অবজেক্ট তৈরি করেন তবে আমরা বলতে পারি যে ম্যানেজার একজন কর্মচারী। কারণ শ্রেণি ব্যবস্থাপক: কর্মচারী কর্মী শ্রেণি এবং ব্যবস্থাপক শ্রেণীর মধ্যে ইস-এ সম্পর্ককে চিত্রিত করে । সুতরাং আমরা বলতে পারি যে প্রতিটি পরিচালক একজন কর্মচারী।

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

সুতরাং উত্তরটি হ'ল, যদি আপনি কর্মচারী শ্রেণীর অবজেক্ট থেকে ম্যানেজার ক্লাস অবজেক্টে ডাউনকাস্ট করতে চান তবে প্রথমে আপনার অবশ্যই ম্যানেজার ক্লাসের অবজেক্ট থাকতে হবে তবে আপনি এটি আপকাস্ট করতে পারবেন এবং তারপরে আপনি এটিকে ডাউনকাস্ট করতে পারেন।


-1

উপকাস্টিং এবং ডাউনকাস্টিং:

উপকাস্টিং: ডেরাইভড-ক্লাস থেকে বেস ক্লাস ডাউন কাস্টিংে কাস্টিং: বেস ক্লাস থেকে ডেরিভড ক্লাসে কাস্টিং

আসুন উদাহরণ হিসাবে একই বুঝতে পারি:

নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়েছে আমার পিতামাতা বর্গ হিসাবে শেপ এবং একটি উত্পন্ন শ্রেণি হিসাবে বৃত্ত হিসাবে দুটি শ্রেণি বিবেচনা করুন:

class Shape
{
    public int Width { get; set; }
    public int Height { get; set; }
}

class Circle : Shape
{
    public int Radius { get; set; }
    public bool FillColor { get; set; }
}

উজান করা:

শেপ s = নতুন শেপ ();

বৃত্ত সি = গুলি;

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

উজান করার একটি বাস্তব উদাহরণ স্ট্রিম বর্গ যা। নেট ফ্রেমওয়ার্কের সমস্ত প্রকারের স্ট্রিম রিডারের বেসক্লাস:

স্ট্রিমরিডার রিডার = নতুন স্ট্রিমরিডার (নতুন ফাইল স্ট্রিমরিডার ());

এখানে, ফাইলস্ট্রিম রিডার () স্ট্র্যাডেম রিডারে আপকাস্ট করা হয়েছে।

ডাউন কাস্টিং:

শেপ s = নতুন সার্কেল (); উপরে বর্ণিত হিসাবে এখানে, পিতামাতা এবং সন্তানের উভয়ের জন্যই এটির দৃষ্টিভঙ্গি একমাত্র পিতামাতা, আমাদের এটি খর্ব করতে হবে

var c = (বৃত্ত) গুলি;

ডাউনকাস্টিংয়ের ব্যবহারিক উদাহরণ হ'ল ডাব্লুপিএফের বোতাম শ্রেণি।

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