سؤال

أحصل على تحذير التحويل البرمجي التالي:

'Resources.Foo.GetType()' hides inherited member 'object.GetType()'. Use the new keyword if hiding was intended.    Resources.NET\Resources\Class1.cs   123 20  Resources

لهذا الرمز (المبسط للغاية):

public interface IFoo
{
    int GetType();
    string GetDisplayName();
}

public class Foo : IFoo
{
    public int GetType() { return 3; }   *** Warning: points to here (line 123)***
    public string GetDisplayName() { return "Foo"; }
}

ملاحظة، ما لم أحصل عليه هو سبب عدم الحصول على وظيفة GetDisplayName () تحذيرا. أنا تطل على شيء ما.

لقد قمت بإثارة فائض المكدس وقم بغوغلة هذا الخطأ ويبدو أنه ينطبق على ميراث الفصل، وليس واجهات. أنا مرتبك حقا لماذا سيتم تشغيل هذا على الواجهة (التي تحدد أساليبها Virtual).

شكرا مقدما على البصيرة.

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

المحلول

ال getype. يتم تعريف الطريقة على system.object. فئة، وهي الفئة الأساسية النهائية لجميع فئات الإطار.

يتم استخدام هذه الطريقة للحصول على اكتب من المثيل الحالي في وقت التشغيل، وأعتقد أنك لا تنوي تجاوزه (لديك نوع إرجاع INT).

أقترح عليك إعادة تسمية الطريقة إلى GetFootype أو أي شيء آخر، أو تنفيذ واجهةك صراحة لتجنب مشاكل وقت التشغيل.

نصائح أخرى

يشير إلى طريقك يختبئ GetType من الكائن، وليس من واجهة الخاص بك. نظرا لأن صفك يرث كائن وينفذ IFoo, ، كلاهما يوفر GetType الطريقة، بقلم بشكل ضمني تنفيذ الواجهة التي سوف تخفيها GetType موروثة من الكائن. إذا كنت لا تزال ترغب في استدعاء طريقة الواجهة الخاصة بك GetType, ، يمكنك تنفيذها صراحة بدلا من ذلك في Foo:

int IFoo.GetType()
{
    return 3;
}

جميع الأنواع في .NET تستمد من System.Object.

يحدد System.Object بالفعل طريقة تسمى GetTyPe. إذا حددت طريقة أخرى "Getype" في صفك، وإذا قام شخص ما بإنشاء كائن من صفك، فلا يمكن أن يستدعي طريقة GetTyPe التي توفرها System.Object. هذا هو السبب في أنك تحصل على تحذير أن "Getype" يخفي الطريقة المعرفة في System.Object. أنت لا تحصل على هذا التحذير من أجل GetDisplayName لأن System.Object (أو لهذه المسألة أي فئة أودي) لا يحدد هذه الطريقة.

أود أن أوصي بتغيير اسم طريقةك إلى شيء آخر كما يتوقع مطورو .NET بشكل عام استدعاء طريقة GetType للإشارة إلى تطبيق System.Object.

لا يشكو من تنفيذك للواجهة، بل إعادة تطبيق GetType () بدلا من ذلك "كائن" - الذي يرث منه FOO تلقائيا. "الكائن" لا يحتوي على طريقة GetDisplayName وبالتالي لا يرفع أي شكوى إلى ذلك. حاول إعادة تسمية الطريقة أو إضافة في المعدل "الجديد" إذا كنت ترغب حقا في إخفاء الكائن. حاول () على الرغم من أنه غير مستحسن.

System.Object فئة لديها بالفعل طريقة getype ()

يجب عليك استخدام الكلمة الرئيسية الجديدة أو تجاوزها لحل هذه المشكلة

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