理解C#多态Polymorphic, new, virtual, override, sealed
来源:互联网 发布:手机铃声加大软件 编辑:程序博客网 时间:2024/06/01 08:54
Polymorphic多态在C#new, virutal, override, sealed
New 是指隐藏父类的方法
Virtual 是指允许子类覆盖
Override 是覆盖父类的Virtual方法
Sealed 是指不可再被继承
1. static 方法不可被继承
2. C#编译器会提出警告,并且会自动加上new, 比如你新建了一个类,并且试图override ToString方法,但如果你不使用override,编译器会给出警告,实际上在IL中会自动加上new
3. sealed override 不可以再被覆盖,但子类可以使用new 或 newvirtual, 而且父类必须使用了virutal, 它与override的区别在于override 可以在子类继续使用 override
classA
{
public virtual void F() {
Console.WriteLine("A.F");
}
public virtual void G() {
Console.WriteLine("A.G");
}
}
classB: A
{
sealed override public void F() {
Console.WriteLine("B.F");
}
override public void G() {
Console.WriteLine("B.G");
}
}
classC: B
{
override public void G() {
Console.WriteLine("C.G");
}
}
4. 使用了virutal,子类如果在使用virtual则应该加上new, 这时子类也可以使用override.
5. override 要求父类被覆盖的方法必须是override(它的始祖是virtual)或virutal 而且不能是private (编译错误,virual 和 private 不能同时使用),这一点和Java不同, Java 会让父类的该private方法隐藏不覆盖
6. 可见性的要求. C# 如果不制定可见性,默认是private,而Java默认是包可见。使用virtual 是, 必须使用protected或public 对应的子类也必须是protected(当父类是protected)/public(当父类是public), 这也和Java不一样, Java 要求父类到子类的可见性应该扩大
7. 只有明确使用了override才能表示该方法被覆盖了,这个Java默认的隐式覆盖有明显区别,接下来我们看几个例子
public interfaceIInterface
{
void Method();
}
public classMyImpl1 : IInterface
{
public void Method()
{
Console.WriteLine("MyImpl1 - Method");
}
}
public classMyImpl2 : MyImpl1
{
public void Method()
{
Console.WriteLine("MyImpl2 - Method");
}
}
IInterface iinf= newMyImpl2();
iinf.Method(); // 输出 :MyImpl1 - Method
MyImpl2MyImpl2 = newMyImpl2();
MyImpl2.Method(); // 输出 :MyImpl2- Method
((MyImpl1)MyImpl2).Method(); // 输出 :MyImpl1 - Method
public class MyImpl1 : IInterface
{
public virtualvoid Method()
{
Console.WriteLine("MyImpl1 - Method");
}
}
public classMyImpl2 : MyImpl1
{
public overridevoid Method()
{
Console.WriteLine("MyImpl2 - Method");
}
}
IInterface iinf= newMyImpl2();
iinf.Method(); // 输出 :MyImpl2 – Method
MyImpl2MyImpl2 = newMyImpl2();
MyImpl2.Method(); //输出 :MyImpl2 – Method
((MyImpl1)MyImpl2).Method() ;//输出 :MyImpl2 – Method
- 理解C#多态Polymorphic, new, virtual, override, sealed
- C# new,Virtual,abstract,sealed,Override的簡單理解
- C# 关键字 abstract, virtual, override, sealed, new
- new virtual abstract sealed override
- c#关键词 virtual、override、new、abstract、sealed的用法
- c#中abstract、override、new、virtual、sealed使用和示例
- C#中的一些方法修饰关键字virtual override sealed new
- C#关键字sealed override abstract virtual new总结
- C#继承之base,virtual,override,abstract,new,sealed关键字
- c#的new、abstract、virtual、override,sealed关键字区别
- c#中abstract、override、new、virtual、sealed使用和示例
- c#中abstract、override、new、virtual、sealed使用和示例
- sealed、new、virtual、abstract与override 总结
- sealed、new、virtual、abstract与override 总结
- sealed,new,virtual,abstract与override
- Modifiers: virtual, override, new, abstract, sealed, internal
- 转:C#继承之base,virtual,override,abstract,new,sealed关键字
- C#若干关键字解析 (abstract, interface, sealed, virtual, override, new, delegate)
- c++实现插入排序模版
- 关于TLD算法的论文
- C#thie和base(二)
- 几种常见SQL分页方式效率比较
- HDOJ2028 Lowest Common Multiple Plus 求n个数的最小公倍数
- 理解C#多态Polymorphic, new, virtual, override, sealed
- 【转】PHP 5.4.9 和 5.3.19 发布
- Windows Store apps开发[56]使用外部字体
- 《成语接龙》隐私说明
- 【转】Discuz! X3.0二度曝光:站长意见、建议综合答疑帖
- Bloom Filter算法
- Maven 环境的配置
- oracle 锁查询 select加锁方法
- 优化网站波动原因分析及解决措施分享篇