- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里是第一个问题,所以希望你们都对我温和一点!
在过去的几天里,我阅读了大量有关多态性的书籍,并尝试将其应用到我在 C# 中所做的工作中,似乎有几种不同的方法来实现它。我希望我已经掌握了这件事,但即使我没有得到澄清,我也会很高兴。
据我所知,我有 3 个选择:
virtual
' 在我使用的任何方法上希望我的派生类覆盖。 据我所知,如果我不需要在基础中有任何实现逻辑,那么接口(interface)会给我最大的灵 active (因为我不会在多重继承等方面限制自己),但如果我要求基类能够在派生类所做的任何事情之上做一些事情,那么使用 1 或 2 将是更好的解决方案?
感谢您对这些人的任何意见 - 这个周末我在本网站和其他地方阅读了很多内容,我认为我现在理解了这些方法,但我只是想澄清一下如果我在正确的轨道上,则使用特定于语言的方式。希望我也正确标记了它。
干杯,特里
最佳答案
接口(interface)提供了最多的抽象;您不依赖于任何特定的实现(如果由于其他原因,实现必须具有不同的基类,则很有用)。
真正的多态,virtual
是必须的;多态性最常与类型子类化相关...
您当然可以将两者混合使用:
public interface IFoo {
void Bar();
}
class Foo : IFoo {
public virtual void Bar() {...}
}
class Foo2 : Foo {
public override ...
}
abstract
是另外一回事; abstract
的选择实际上是:它可以由基类明智地定义吗?如果没有默认实现,它必须是抽象
。
当有很多共同的实现细节时,一个共同的基类会很有用,纯粹通过接口(interface)复制是没有意义的;但有趣的是 - 如果实现从不因实现而异,扩展方法提供了一种在接口(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;
}
}
}
关于c# - 在 C# 中实现多态性,如何最好地做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/933831/
我是一名优秀的程序员,十分优秀!