سؤال

لقد كنت أقرأ من خلال الكتاب الذي يعمل بفعالية مع الرمز القديم ولم ألعب مع مفهوم تجاوز طرق اختبار صعوبة في اختبارات الوحدة عبر إنشاء وهمية. لقد وضعت مثالا على ما اعتقدت أنه سيعمل وانتهى الأمر بالتصرف بطريقة مختلفة عن أنني كنت أتوقع. أعتقد أنني اكتشفت للتو من مجرد فتحة في فهمي لكيفية أعمال التحميل الزائد في الميراث والطريقة في C # وأنا أتساءل عما إذا كان شخص ما يمكن أن يساعدني في فهم ما يحدث هنا.

لدي الواجهة التالية:

public interface IAnimal
{
    void MakeSound();
    void Move();
}

ثم أخلق تنفيذ واجهة الحيوان كما يلي:

public class Dog : IAnimal
{

public void MakeSound()
{
    Console.WriteLine("Woof");
}

public void Move()
{
    Console.WriteLine("Moved");
}

}

عندما أستخدم هذه الفئة كما يلي:

IAnimal myanimal = new Dog();
myanimal.MakeSound();
myanimal.Move();

أحصل على الإخراج التالي: انتقل WOOF

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

أقوم بإنشاء كلب مزيف عن طريق تمديد فئة الكلب وإنشاء طريقة لاجست

public class FakeDog : Dog
{
    public void MakeSound()
    {
         Console.WriteLine("Bark");
    }
}

عندما أستخدم هذه الفئة كما يلي:

IAnimal myanimal = new FakeDog();
myanimal.MakeSound();
myanimal.Move();

أحصل على الإخراج التالي: انتقل WOOF

كنت أتوقع أن يكون: ينبح اللحاء

ومع ذلك، إذا قمت بعد ذلك بتنفيذ فئة Fickogog واجهة الحيوان واستخدامها:

public class FakeDog : Dog, IAnimal
{
    public void MakeSound()
    {
         Console.WriteLine("Bark");
    }
}

أحصل على الإخراج التالي: انتقلت اللحاء

أنا فقط أريد أن أفهم السبب في أن هذا يتجاوز الآن الطريقة كما كنت أتوقع عندما كنت قد مددت فقط فئة الكلب. هل يمكن لأي شخص أن يضعني مباشرة على هذا؟

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

المحلول

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

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

لتجنب إعادة تنفيذ الواجهة، يمكنك إجراء MakeSound الظاهري في Dog, ، ثم تجاوزها صراحة FakeDog. وبعد عند هذه النقطة، هناك قرارا واحدا واحدا فقط متورطا، وكل شيء أبسط لفهمه. أحاول تجنب إعادة التشغيل والطريقة المختبئة كلما أمكن ذلك.

نصائح أخرى

(آسف للإجابة على سؤال، ولكن قد تجد حقا هذه التجربة بالمعلومات) ما يحدث عند تطبيق الكلب كما يلي:

public class Dog : IAnimal
{

public virtual void MakeSound()
{
    Console.WriteLine("Woof");
}

//...

لاحظ "الظاهري"

تحتاج إلى إعلان MakeSound الطريقة كما virtual في ال Dog الطبقة و تجاوز ذلك في FakeDog صف دراسي:

public class Dog : IAnimal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Woof");
    }

    public virtual void Move()
    {
        Console.WriteLine("Moved");
    }
}

public class FakeDog : Dog
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top