كيف يمكن لـ System.Object استخدام الفئات الفرعية كأنواع الإرجاع الخاصة به؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

صحيح في .NET أن الجميع الأنواع ترث من System.Object.

ما أجده متناقضًا هو بعض الطرق في System.Object - وهي

  • الظاهرية العامة خيط إلى سلسلة()؛
  • الظاهرية العامة منطقي يساوي (الكائن objA، الكائن objB)؛

يتم توريث System.String من System.Object:

[Serializable]
public class String : Object { /*...*/ }

System.Boolean موروث من System.Object:

[Serializable]
public struct Boolean : Object { /*....*/ }

ما الذي يحدث تحت الأغطية الذي سمح لفئة System.Object بالسماح باستخدام الفئات الفرعية كأنواع إرجاع في أساليبها؟كيف تم تجميع هذا الكود، حيث يبدو أن هناك مراجع دائرية.سلسلة <-> كائن <-> منطقية.

أنا متأكد من أنني سأرى عبارات حول "هذه هي الطريقة التي يتم تنفيذها بها"، ولكن يمكنني أن أفهم ما إذا كانت أنواع الإرجاع هذه هي "System.Object" نفسها، ثم استخدمت فئة فرعية تطبيقات السلسلة وbool و System.ValueTypes الأخرى للإعلان عن أ جديد الطبقة الأساسية.

وآمل أن يجعل الشعور.

شكرا لك مقدما،

دومينيك

هل كانت مفيدة؟

المحلول

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

class A
{
    public B CreateB();
    {
        return new B();
    }
}

class B : A
{
}

لاحظ أنه كان ستكون هناك مشكلة إذا تم تعريف A وB في تجميعات منفصلة، ​​لأن ذلك سيتطلب مرجع تجميع دائري، وهو أمر غير مسموح به

نصائح أخرى

مرجع دائري هو مجرد مشكلة عبر مشاريع متعددة، وإلا فإن علاقة الوالدين / الطفل لن تكون موجودة على الجانبين أيضا.

في الواقع، هو ليس صحيح تماما أن جميع الأنواع ترث من الكائن. يرجى الاطلاع على Eric Lippert مدونة الدخول على هذا.

أنا لا أرى مشكلة الطبقة الأساسية التي تعود فئة مشتقة.

علاوة على ذلك، لا أرى تبعيات دائرية منذ كائن .Tostring ()؛ إرجاع كائن سلسلة. فئة السلسلة مستمدة من الكائن، ولكن ماذا؟ إذا كانت كلاهما في نفس التجميع، فلا توجد مشكلة.

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

public class A<T>
{
}

public class B : A<B>
{
}

إذا كنت ترغب في رؤية تبعية دائرية في إطار .NET، فلا تنظر إلى أبعد من System.dll, System.Xml.dll و System.Configuration.dll:

كيف أنشأت Microsoft هذه التجميعات هي لغز بالنسبة لي. في الواقع، قد نشر هذا كما سؤال آخر...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top