إلقاء كائن إلى فئة قاعدة ، إرجاع الكائن الموسع؟
-
26-09-2019 - |
سؤال
رمز بلدي:
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);