Ter*_*own 3 c# oop polymorphism
第一个问题在这里,所以希望你们都会轻轻地对我说话!
在过去的几天里,我一直在阅读关于多态的非常多的内容,并试图将它应用到我在c#中所做的事情,似乎有几种不同的方法来实现它.我希望我已经掌握了这个,但即使我没有澄清,我也很高兴.
从我所看到的,我有3个选择:
virtual在我希望我的派生类重写的任何方法上使用关键字' '. 从我所看到的,如果我不需要基础中的任何实现逻辑,那么一个接口给了我最大的灵活性(因为我当然不限制我自己的多重继承等),但如果我需要基础为了能够在派生类正在做的事情之上做一些事情,那么使用1或2将是更好的解决方案?
感谢有关这些人的任何意见 - 本周末我已经阅读了这么多内容,无论是在本网站还是其他地方,我认为我现在理解这些方法,但我只是想以语言特定的方式澄清如果我在右边跟踪.希望我也正确地标记了这一点.
干杯,特里
界面提供最多的抽象; 您不依赖于任何特定的实现(如果由于其他原因,实现必须具有不同的基类,则非常有用).
对于真正的多态性,virtual是必须的; 多态性最常与类型子类化相关联......
你当然可以混合两者:
public interface IFoo {
void Bar();
}
class Foo : IFoo {
public virtual void Bar() {...}
}
class Foo2 : Foo {
public override ...
}
Run Code Online (Sandbox Code Playgroud)
abstract是一个单独的事情; abstract真正的选择是:它可以由基类理智地定义吗?如果没有默认实现,则必须是abstract.
当存在许多常见的实现细节时,常见的基类可能很有用,并且纯粹通过接口复制是没有意义的; 但有趣的是 - 如果实现永远不会因每个实现而有所不同,那么扩展方法提供了一种有用的方法来公开它interface(这样每个实现都不必这样做):
public interface IFoo {
void Bar();
}
public static class FooExtensions {
// just a silly example...
public static bool TryBar(this IFoo foo) {
try {
foo.Bar();
return true;
} catch {
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)