অভিভাবক শ্রেণি থেকে শিশু শ্রেণিতে কাস্ট করতে অক্ষম


104

আমি পিতামাতাদের ক্লাস থেকে শিশু শ্রেণিতে কাস্ট করার চেষ্টা করছি তবে আমি একটি অকার্যকরপর্ব পেয়েছি। শিশু শ্রেণিতে কেবলমাত্র টাইপ ইন্টের একটি সম্পত্তি রয়েছে। আমার কী করা দরকার তা কি কেউ জানেন?


এটি জেনে রাখাও ভাল, আপনি বেস / উত্স সম্পর্কিত ক্লাসের জন্য সুস্পষ্ট কাস্টিং ব্যবহার করতে পারবেন না।
— Rzassar

উত্তর:


138

সি # তে ডাউন কাস্ট করার একটি সহজ উপায় হ'ল পিতামাতাকে সিরিয়ালাইজ করা এবং তারপরে এটি সন্তানের মধ্যে ডিসেরায়ালাইজ করা।

 var serializedParent = JsonConvert.SerializeObject(parentInstance); 
 Child c  = JsonConvert.DeserializeObject<Child>(serializedParent);

আমি একটি সহজ কনসোল অ্যাপ্লিকেশন যে কুকুর মধ্যে পশু কাস্ট, ওভার কোডের উপরে দুই লাইন ব্যবহার আছে এখানে


22
ঠিক আছে, আমি একে "ডাউনকাস্ট" বলতে দ্বিধা করব।
— কার্ক ওল

কেবল একটি নোট, পরিবর্তনশীল নামগুলি উপরের মতো নয় same
— জ্যাক গ্যাস্টন

7
আমি ভালোবাসি যখন কেউ বাক্সের বাইরে ভাবেন এবং লোকদের ওপিকে বলছেন যে এটি করা যাচ্ছে না (এক বা দুটি ট্রল সংরক্ষণ করুন)! এই এক সহায়তার জন্য ধন্যবাদ। আমি কয়েক ঘন্টা ধরে এটি বের করার চেষ্টা করছি :)
— derekmx271

4
এটি একটি দুর্দান্ত সমাধান। আমার একটি কেস হয়েছে যেখানে আমার শিশু শ্রেণি কোনও অতিরিক্ত কার্যকারিতা ছাড়াই পিতামাতার জন্য কেবল একটি মোড়ক ছিল। আমি এটি করেছি তাই আমার অ্যাপ্লিকেশনটিতে ওয়েব রেফারেন্স আমদানি করতে হবে না কারণ এটি আমার সহায়ক লাইব্রেরিতে ছিল। এটি আমাকে পিতামাতাকে আমার মোড়কের ক্লাসে রূপান্তর করতে দেয়। ধন্যবাদ!
— ব্রায়ানভিপিএস

4
তুমি একজন প্রতিভাবান! :)
— ইয়াবলারগো

122

আপনি কুকুরের জন্য স্তন্যপায়ী প্রাণী ফেলে দিতে পারবেন না - এটি একটি বিড়াল হতে পারে।

আপনি কোনও স্যান্ডউইচে কোনও খাবার ফেলতে পারবেন না - এটি পিজারবার্গার হতে পারে।

আপনি কোনও ফেরারিতে গাড়ি castালতে পারবেন না - এটি হন্ডা হতে পারে বা আরও বিশেষভাবে বলা যেতে পারে আপনি ফেরারি 360 মোডেনাকে ফেরারি 360 চালান স্ট্রাদালে কাস্ট করতে পারবেন না - পার্থক্যযুক্ত অংশ রয়েছে, যদিও তারা উভয়ই ফেরারি 360 s


17
বোধগম্য রাস্তাঘাটগুলি, সুতরাং এই পদ্ধতিতে প্রকৃতপক্ষে ''ালাই' অসম্ভব ibility কিন্তু যদি সে এমন কুকুর চায় যা একই চোখের রঙ / ওজন / চুলের প্যাটার্ন / বয়স ইত্যাদি স্তন্যপায়ী বস্তুতে রাখা বিড়ালের মতো? মূলত সাধারণ সম্পত্তিগুলি অনুলিপি করা।
— ফাস্টএল

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

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

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

4
ফেরারি উপমা নিস
— লর্ড দার্থ ভাদার

59

আপনার বেস শ্রেণীর রেফারেন্সটি যে উদাহরণটি উল্লেখ করছে তা আপনার শিশু শ্রেণির উদাহরণ নয়। সেখানে কোন ভুল নাই.

আরো নির্দিষ্টভাবে:

Base derivedInstance = new Derived();
Base baseInstance = new Base();

Derived good = (Derived)derivedInstance; // OK
Derived fail = (Derived)baseInstance; // Throws InvalidCastException

কাস্টটি সফল হওয়ার জন্য, আপনি যে পরিস্থিতিটি ডাউন কাস্ট করছেন সেটি অবশ্যই আপনি যে শ্রেণীর সাথে ডাউনকাস্ট করছেন তার উদাহরণ হতে হবে (বা কমপক্ষে আপনি যে শ্রেণীর বংশকে নিচে ফেলেছেন তা অবশ্যই উদাহরণের শ্রেণিবদ্ধের মধ্যে থাকতে হবে), অন্যথায় কাস্ট ব্যর্থ হবে।


বা সম্ভাব্যভাবে বেস অন্যান্যডেরিভড = নতুন অন্যান্যডেরিভড (); ডেরিভড অন্যফেইল = (উত্সর্গীকৃত) অন্যান্য ডেরাইভড;
— ব্লেয়ার কনরাড

বর্গ বেস {} শ্রেণি উত্পন্ন: বেস {} // মেইন মেথড বেস বেস ডেরাইভেড ইনস্ট্যান্স = নতুন ডেরিভড (); বেস বেসআইনস্ট্যান্স = নতুন বেস (); উদ্ভূত ভাল = (উত্পন্ন) deridedInstance; ব্যয়িত ব্যর্থ = (উত্পন্ন) বেসInstance; .NET 3.5 এ কোনও ত্রুটি ছাড়াই এটি সংকলন করে। আপনি যে সমস্যাটি বলছেন তা কোথায়?
— প্রদীপপটপ

8
@ প্রদীপটিপ: অবশ্যই এটি তৈরি করে। সংকলনের ত্রুটি সম্পর্কে কে কিছু বলেছেন?
— গ্রেগ ডি

19

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

যেমনটি আমরা জেনেছি। সমস্ত কাস্টিংয়ের দুটি বিস্তৃত বিভাগ রয়েছে।

  1. মান ধরণের জন্য
  2. রেফারেন্স প্রকারের জন্য (আপনার ক্ষেত্রে এটির রেফারেন্স টাইপ)

রেফারেন্স ধরণের আরও তিনটি প্রধান পরিস্থিতি রয়েছে যার মধ্যে কোনও দৃশ্য মিথ্যা বলতে পারে।

শিশু থেকে পিতামাত (অন্তর্ভুক্ত ingালাই - সর্বদা সফল)

কেস 1. যে কোনও প্রত্যক্ষ বা অপ্রত্যক্ষ পিতামাতার কাছে সন্তান

Employee e = new Employee();
Person p = (Person)e; //Allowed

সন্তানের কাছে পিতা বা মাতা (সুস্পষ্ট কাস্টিং - সফল হতে পারে)

কেস ২. প্যারেন্ট ভেরিয়েবল হোল্ডিং প্যারেন্ট অবজেক্ট (অনুমোদিত নয়)

Person p = new Person();  // p is true Person object
Employee e = (Employee)p; //Runtime err : InvalidCastException <-------- Yours issue

কেস ৩. প্যারেন্ট ভেরিয়েবল হোল্ডিং চাইল্ড অবজেক্ট (সর্বদা সফল)

দ্রষ্টব্য: যেহেতু বস্তুর পলিমার্পিক প্রকৃতি রয়েছে, তাই পিতামাতার শ্রেণীর ধরণের একটি চলকের পক্ষে সন্তানের ধরণ রাখা সম্ভব।

Person p = new Employee(); // p actually is Employee
Employee e = (Employee)p; // Casting allowed

উপসংহার: সর্বোপরি পড়ার পরে, আশা করি পিতা-মাতার সন্তানের রূপান্তর কীভাবে সম্ভব (পর্ব 3) এর মতো এটি এখন উপলব্ধি হয়ে যাবে।

প্রশ্নের উত্তর দাও :

আপনার উত্তর 2 ক্ষেত্রে here আপনি যেখানে দেখতে পাচ্ছেন এমন কাস্টিংকে ওওপি অনুমতি দেয় না এবং আপনি ওওপির একটি মৌলিক নিয়ম লঙ্ঘনের চেষ্টা করছেন o সুতরাং সর্বদা নিরাপদ পথ বেছে নিন।

আরও এই জাতীয় ব্যতিক্রমী পরিস্থিতি এড়াতে। নেট ব্যবহারের পরামর্শ দিয়েছে / অপারেটর হিসাবে যারা আপনাকে অবহিত সিদ্ধান্ত নিতে এবং নিরাপদ ingালাই সরবরাহ করতে সহায়তা করবে।


আমি আপনার উত্তরের স্পষ্টতা পছন্দ করি। কেবল একটি ইস্যুটির / হিসাবে নথির জন্য লিঙ্কটি 404 দেয় the নীচের লিঙ্কটি আপনি কী উল্লেখ করছেন? পরীক্ষা এবং কাস্ট টাইপ করুন
— জে ম্যান

18

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

বাক্সের সলিউশন -এর একটি ব্যবহারিক চিন্তাভাবনা হ'ল একটি এক্সটেনশন হেল্পার ক্লাস ঘোষণা করা যা বাস্তবে বেস ক্লাসটি উত্তরাধিকার সূত্রে প্রাপ্ত হয় নি, তবে সদস্য হিসাবে এটি অন্তর্ভুক্ত ছিল।

public class BaseExtension
{
   Base baseInstance;

   public FakeDerived(Base b)
   {
      baseInstance = b;
   }

   //Helper methods and extensions to Base class added here
}

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


আমি কি এই ভেবে ঠিক আছি যে আপনি সম্ভবত আপনার BaseExtensionএখানে চান যে আপনি কমপক্ষে IBaseঅনুরূপ প্রসঙ্গে ব্যবহার করতে পারেন এমন বাস্তবায়ন করুন ? বা আপনার প্রয়োজনের জন্য গুরুত্বপূর্ণ ছিল না?
— tobriand

উত্তরাধিকারের জন্য যথাযথ বিকল্প হিসাবে কিছু সময় অন্তর্ভুক্ত থাকতে পারে
— ওয়াহিদ গাদিরি

13

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

এখানে প্রয়োজনীয়ের চেয়ে সামান্য জটিল কনফিগারেশন রয়েছে তবে বেশিরভাগ ক্ষেত্রেই যথেষ্ট নমনীয়:

public class BaseToChildMappingProfile : Profile
{
    public override string ProfileName
    {
        get { return "BaseToChildMappingProfile"; }
    }

    protected override void Configure()
    {
        Mapper.CreateMap<BaseClass, ChildClassOne>();
        Mapper.CreateMap<BaseClass, ChildClassTwo>();
    }
}


public class AutoMapperConfiguration
{
    public static void Configure()
    {
        Mapper.Initialize(x =>
        {
            x.AddProfile<BaseToChildMappingProfile>();
        });
    }
}

যখন অ্যাপ্লিকেশন কল শুরু হয় AutoMapperConfiguration.Configure()এবং তারপরে আপনি এটির মতো প্রকল্প করতে পারেন:

ChildClassOne child = Mapper.Map<BaseClass, ChildClassOne>(baseClass);

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


অন্যের কাছে একক সম্পত্তি সহ কোনও ধরণের মানচিত্র তৈরি করতে অটোম্যাপার ব্যবহার করা (ওপি বর্ণিত ওপরের মতো) ডিম ফাটানোর জন্য স্লেজ হাতুড়ি ব্যবহার করার মতো। কেন কেবল উদ্ভূত প্রকারের নতুন নয় এবং এর সম্পত্তিটি নিজেকে বরাদ্দ করুন (যা কোডের 1 লাইন)।
— বাইটেডেভ

9

পল, আপনি 'আমি এটি করতে পারি' জিজ্ঞাসা করিনি - আমি ধরে নিচ্ছি যে আপনি এটি কীভাবে করবেন তা জানতে চান !

আমাদের একটি প্রকল্পে এটি করতে হয়েছিল - এমন অনেকগুলি ক্লাস রয়েছে যা আমরা জেনেরিক ফ্যাশনে ঠিক একবার সেট আপ করেছি, তারপরে উত্পন্ন ক্লাসগুলির জন্য নির্দিষ্ট বৈশিষ্ট্যগুলি আরম্ভ করব। আমি ভিবি ব্যবহার করি তাই আমার নমুনা ভিবিতে রয়েছে (শক্ত noogies), তবে আমি এই সাইট থেকে ভিবি নমুনাটি চুরি করেছি যার আরও ভাল সি # সংস্করণ রয়েছে:

http://www.eggheadcafe.com/tutorials/aspnet/a4264125-fcb0-4757-9d78-ff541dfbcb56/net-reflection--copy-cl.aspx

কোডের উদাহরণ:

Imports System
Imports System.Collections.Generic
Imports System.Reflection
Imports System.Text
Imports System.Diagnostics

Module ClassUtils

    Public Sub CopyProperties(ByVal dst As Object, ByVal src As Object)
        Dim srcProperties() As PropertyInfo = src.GetType.GetProperties
        Dim dstType = dst.GetType

        If srcProperties Is Nothing Or dstType.GetProperties Is Nothing Then
            Return
        End If

        For Each srcProperty As PropertyInfo In srcProperties
            Dim dstProperty As PropertyInfo = dstType.GetProperty(srcProperty.Name)

            If dstProperty IsNot Nothing Then
                If dstProperty.PropertyType.IsAssignableFrom(srcProperty.PropertyType) = True Then
                    dstProperty.SetValue(dst, srcProperty.GetValue(src, Nothing), Nothing)
                End If
            End If
        Next
    End Sub
End Module


Module Module1
    Class base_class
        Dim _bval As Integer
        Public Property bval() As Integer
            Get
                Return _bval
            End Get
            Set(ByVal value As Integer)
                _bval = value
            End Set
        End Property
    End Class
    Class derived_class
        Inherits base_class
        Public _dval As Integer
        Public Property dval() As Integer
            Get
                Return _dval
            End Get
            Set(ByVal value As Integer)
                _dval = value
            End Set
        End Property
    End Class
    Sub Main()
        ' NARROWING CONVERSION TEST
        Dim b As New base_class
        b.bval = 10
        Dim d As derived_class
        'd = CType(b, derived_class) ' invalidcast exception 
        'd = DirectCast(b, derived_class) ' invalidcast exception
        'd = TryCast(b, derived_class) ' returns 'nothing' for c
        d = New derived_class
        CopyProperties(d, b)
        d.dval = 20
        Console.WriteLine(b.bval)
        Console.WriteLine(d.bval)
        Console.WriteLine(d.dval)
        Console.ReadLine()
    End Sub
End Module

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

কাস্টিং সাধারণভাবে একই বস্তুর দিকে ইঙ্গিত করে 2 ভেরিয়েবল তৈরি করে (মিনি টিউটোরিয়াল এখানে, দয়া করে কর্নার কেস ব্যতিক্রমগুলি আমার দিকে ফেলে দেবেন না)। এটির (পাঠকের অনুশীলন) লক্ষণীয় লক্ষণ রয়েছে!

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

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


4
আমি জানি এটি বাস্তবতার পরে, তবে এটি "অ্যান্ডলসো ডিস্টপ্রোপার্টি.ক্যান রাইট" আপনার "যদি ডিএসপিপ্রपर्টি ইসন নট কিছুই না" পরীক্ষায় অন্তর্ভুক্ত করা উচিত, যাতে এটি নিশ্চিত হয় যে এটি কেবল পঠনযোগ্য সম্পত্তি নয়।
— জেমসএমএলভি

@ জেমসএমএলভি - ধন্যবাদ ভাল ধরা 'সত্যের পরে' - দেখে মনে হচ্ছে না যে ওপি কোনওভাবেই কোনও উত্তর গ্রহণ করবে :-( সুতরাং এর পরে হওয়ার মতো কোনও সত্য নেই Oh ওহ ভাল।
— ফাস্টএল

4

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


2

আমার হিসাবে এটি বেস শ্রেণি থেকে সমস্ত সম্পত্তি ক্ষেত্রগুলি পিতামাতার কাছে এইভাবে অনুলিপি করা যথেষ্ট ছিল:

using System.Reflection;

public static ChildClass Clone(BaseClass b)
{
    ChildClass p = new ChildClass(...);

    // Getting properties of base class

    PropertyInfo[] properties = typeof(BaseClass).GetProperties();

    // Copy all properties to parent class

    foreach (PropertyInfo pi in properties)
    {
        if (pi.CanWrite)
            pi.SetValue(p, pi.GetValue(b, null), null);
    }

    return p;
}

যে কোনও বস্তুর সর্বজনীন সমাধান এখানে পাওয়া যাবে


রেফারেন্স-ধরণের বৈশিষ্ট্যের জন্য এটি কাজ করা উচিত নয়। নতুন এবং পুরানো দৃষ্টান্তগুলি রেফারেন্স-টাইপ প্রোটেটিসের জন্য একই রেফারেন্স ব্যবহার করবে।
— ইব্রাম শেহতা

2

সি # 7.0 হিসাবে, আপনি এটি করতে কীওয়ার্ডটি ব্যবহার করতে পারেন :

এই শ্রেণীর সংজ্ঞায়িত:

class Base { /* Define base class */ }
class Derived : Base { /* Define derived class */ }

এরপরে আপনি কিছু করতে পারেন:

void Funtion(Base b)
{
    if (b is Derived d)
    {
        /* Do something with d which is now a variable of type Derived */
    }
}

যা সমান হবে:

void Funtion(Base b)
{
    Defined d;
    if (b is Derived)
    {
        d = (Defined)b;
        /* Do something with d */
    }
}

আপনি এখন কল করতে পারেন:

Function(new Derived()); // Will execute code defined in if

পাশাপাশি

Function(new Base()); // Won't execute code defined in if

এইভাবে আপনি নিশ্চিত হতে পারেন যে আপনার ডাউনকাস্টটি বৈধ হবে এবং কোনও ব্যতিক্রম ছুঁড়ে ফেলবে না!


1

কাস্ট করতে, আসল অবজেক্টটি সমান বা এর থেকে প্রাপ্ত উপকরণের হতে হবে আপনি যে প্রকারের কাস্ট করতে চেষ্টা করছেন ...

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

যদি আপনার আসল অবজেক্ট বেসক্লাস টাইপের হয় , তবে আপনি এটিকে কোনও উদ্ভূত শ্রেণীর ধরণে কাস্ট করতে পারবেন না ...


1

সার্ভিসস্ট্যাক ব্যবহারকারীদের জন্য সিরিয়ালাইজেশন পদ্ধতির একটি প্রকরণ:

var child = baseObject.ConvertTo<ChildType>();

বা আরও ভার্জোজ:

var child = baseObject.ToJson().FromJson<ChildType>();

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

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