صب كائن إلى نوع آخر
-
27-09-2019 - |
سؤال
لدي فصل واحد يسمى A و One Class B
public class A : UserControl { }
public class B : UserControl { }
الآن لدي مجموعة واحدة تقبل وظيفة فئتها كائنات الفئة أ. لا يتم إنشاء هذه التجميع من قبلي ، لذلك ليس لدي أي تحكم. في الأساس هي جمعية الطرف الثالث.
لكني أريد تزويد كائناتي من الفئة B لأنه مخصص قليلاً. كن مطمئنًا أنه يحتوي على جميع خصائص الفئة A. كيف يمكنني تكوين هدف الفئة B الخاصة بي حتى أتمكن من دمج مجموعة الطرف الثالث في مشروعي بالإضافة إلى تخصيص المظهر والشعور وفقًا لاحتياجاتي؟
إذا كنت مثل شيء مثل (A)objB
غير مسموح به. ثم جربت هذا:
UserControl control = objB as UserControl;
A objA = control as A;
لكن المشكلة في هذه الحالة هي Obja خالية.
لتجنب الالتباس: يتم توفير الفئة A والتجميع من قبل الطرف الثالث.
شكرا مقدما :)
المحلول
بالنظر إلى التسلسل الهرمي الخاص بك ، سيكون عليك كتابة مشغل تحويل. لا توجد طريقة مدمجة للقيام بذلك بشكل عام (فكر Dog : Animal
و Cat : Animal
):
public static explicit operator A(B b) {
// code to populate a new instance of A from b
}
يمكنك أيضًا استخدام إطار انعكاس عام والقيام بشيء مثل
public static void PropertyCopyTo<TSource, TDesination>(
this TSource source,
TDestination destination
) {
// details elided
}
إذن يمكنك أن تقول
// b is B
// a is A
b.PropertyCopyTo<A>(a);
التي من شأنها نسخ جميع الخصائص المشتركة بين b
إلى a
.
نصائح أخرى
إلى عن على B
لتكون قابلة للتشكيل إلى أ A
, B
يجب وراثة A
. حتى لو B
يحتوي على جميع خصائص A
, ، لا يزال ليس A
.
يمكنك استخدام نمط محول
إذا كان لا يمكن إلقاء B على (كما في B is A
) لا يمكن تحقيق ما تحاول القيام به دون أن ترث من A. لسوء الحظ لا يدعم C# كتابة البط على عكس العديد من اللغات الديناميكية (أي روبي).
يمكنك أن ترث من الفئة أ:
public class B : A {
}
وإذا كنت بحاجة إلى تجاوز بعض الأساليب/الخصائص ، فقم بتعيينها على virtual
في الفئة أ
أعتقد أنك في الواقع لا تستطيع فعل ذلك.
لماذا لا تضيف خصائصك إلى فئة A جزئية؟