إلقاء كائن إلى فئة قاعدة ، إرجاع الكائن الموسع؟

StackOverflow https://stackoverflow.com/questions/2632469

سؤال

رمز بلدي:

public class Contact
{
    public string id{ get; set; }
    public string contact_type_id { get; set; }
    public string value{ get; set; }
    public string person_id { get; set; }
    public Contact()
    {

    }
}

public class Contact:Base.Contact
{
    public ContactType ContactType { get; set; }
    public Person Person {get; set;}
    public Contact()
    {
        ContactType = new ContactType();
        Person = new Person();
    }
}

و:

Contact c = new Contact();
Base.Contact cb = (Base.Contact)c;

المشكلة:

The **cb** is set to **Contac** and not to **Base.Contact**.
Have any trick to do that????
هل كانت مفيدة؟

المحلول

قرأت الإجابات وما زلت لا أفهم المشكلة! ما هي مشكلة الكود أعلاه؟


علاوة على ذلك ، من التعليقات ، أفهم أنك بحاجة إلى تسلسل الفئة الأساسية فقط. أعتقد أنه لا توجد مشكلة ، لتبدأ. انظر الى المثال-

class A
{
    public int a = -1;
};

class B : A
{
    public int b = 0;
};

class Program
{
    static void Main(string[] args)
    {
        A aobj = new B();
        aobj.a = 100; // <--- your aobj obviously cannot access B's members.
        Console.In.ReadLine();
    }
}

الآن ، إذا كان عليك جعل وظيفة التسلسل الخاصة بك افتراضية ، ثم نعم ، هناك مشكلة. ثم قد يساعد هذا -

abstract class Ia
{
    public abstract void Serialize();
}
class A : Ia
{
    public int a = -1;
    sealed public override void Serialize() {
        Console.Out.WriteLine("In A serialize");
    }
};

class B : A
{
    public int b = 0;
    /*
     * Error here -
    public override void Serialize()
    {
        Console.Out.WriteLine("In B serialize");
    }
     */

    //this is ok. This can only be invoked by B's objects.
    public new void Serialize()
    {
        Console.Out.WriteLine("In B serialize");
    }
};

class Program
{
    static void Main(string[] args)
    {
        A aobj = new B();
        aobj.Serialize();
        Console.In.ReadLine();
    }
}

//Output: In A serialize

نصائح أخرى

لا علاقة له مع Silverlight.

هذا ما يفعله الصب - ما زلت تعيد إشارة إلى c, ، أيّ هو أ Base.Contact.

لا يمكنك الاتصال ContactType أو Person تشغيل cb (ما لم تكن قد Upcast ، وهو ما لا يجب عليك).

ما هي المشكلة في ذلك؟

بالتأكيد لا يمكنك تحويل الفصل إلى واحدة من فصوله الأساسية عن طريق الصب. اعتمادًا على نوع التسلسل الذي تستخدمه ، قد تكون قادرًا على إخبار المسلسل بأن يفترض أن الفئة من النوع الأساسي ، مما يحد من التسلسل لأعضاء النوع الأساسي.

أضف منشئ نسخ إلى فئة أساسية (على سبيل المثال public Contact(Contact other)) وبعد ذلك يمكنك القيام بذلك:

Contact c = new Contact();
Base.Contact cb = new Base.Contact(c);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top