首页 / C# / c# – 为什么在实现接口后才重写方法?
c# – 为什么在实现接口后才重写方法?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 为什么在实现接口后才重写方法?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1632字,纯文字阅读大概需要3分钟。
内容图文
我一直在阅读“有效使用遗留代码”这本书,我一直在讨论通过创建假冒在单元测试中覆盖难以测试的方法的概念.我把一个我认为会起作用的例子放在一起,最终表现得和我想象的不同.我想我刚刚发现了一个关于继承和方法重载如何在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();
我得到以下输出:
纬
移动
现在,让我假装我需要对Dog类进行单元测试,但是其中一个方法MakeSound()需要被覆盖,因为它使得类因某些原因难以测试.
我通过扩展Dog类并为MakeSound创建一个方法来创建一个假狗
public class FakeDog : Dog
{
public void MakeSound()
{
Console.WriteLine("Bark");
}
}
当我使用这个类时如下:
IAnimal myanimal = new FakeDog();
myanimal.MakeSound();
myanimal.Move();
我得到以下输出:
纬
移动
我原以为它曾经是:
吠
移动
但是,如果我让FakeDog类实现动物界面并使用它:
public class FakeDog : Dog, IAnimal
{
public void MakeSound()
{
Console.WriteLine("Bark");
}
}
我得到以下输出:
吠
移动
我只是想了解为什么现在这样的原因会超出我刚刚延长Dog类时的预期.谁能让我直截了当?
解决方法:
在第一种情况下,您正在创建一个隐藏IAnimal.MakeSound原始实现的新方法.你应该看到一个警告,建议你使用new关键字来明确这一点.
在第二种情况下,您将重新实现IAnimal.实现接口不需要override关键字(尽管如果语言设计者需要那么它可能会很好).
为了避免重新实现接口,可以在Dog中使MakeSound成为虚拟,然后在FakeDog中显式覆盖它.那时只涉及一种可能的解决方案,而且一切都更容易理解.我尽可能避免重新实现和方法隐藏.
内容总结
以上是互联网集市为您收集整理的c# – 为什么在实现接口后才重写方法?全部内容,希望文章能够帮你解决c# – 为什么在实现接口后才重写方法?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。