最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
C#中new, override, virtual的具体用法
时间:2022-06-25 08:32:23 编辑:袖梨 来源:一聚教程网
c#中new, override, virtual的具体用法
class program
{
static void main(string[] args)
{
testshape();
console.writeline("testshape end =============" + environment.newline);
testderive();
console.writeline("testderive end =============" + environment.newline);
testderive2();
console.writeline("testderive2 end =============" + environment.newline);
console.readkey();
}private static void testshape()
{
system.collections.generic.listshapes = new system.collections.generic.list ();
shapes.add(new circle());
shapes.add(new rectangle());
shapes.add(new triangle());
shapes.add(new diamond());
foreach (shape s in shapes)
{
s.methodvirtual();
s.method();
console.writeline();
}}
private static void testderive()
{
circle circle = new circle();
rectangle rectangle = new rectangle();
triangle triangel = new triangle();
diamond diamond = new diamond();
circle.methodvirtual();
circle.method();
console.writeline();
rectangle.methodvirtual();
rectangle.method();
console.writeline();
triangel.methodvirtual();
triangel.method();
console.writeline();
diamond.methodvirtual();
diamond.method();
console.writeline();
}private static void testderive2()
{
circle circle = new circle();
printshape(circle);
rectangle rectangle = new rectangle();
printshape(rectangle);
triangle triangel = new triangle();
printshape(triangel);
diamond diamond = new diamond();
printshape(diamond);
///out put:
//circle override methodvirtual
//base method call//base methodvirtual call
//base method call//base methodvirtual call
//base method call//base methodvirtual call
//base method call
}static void printshape(shape sharpe)
{
sharpe.methodvirtual();
sharpe.method();
console.writeline();
}
}public class shape
{
public virtual void methodvirtual()
{
console.writeline("base methodvirtual call");
}public void method()
{
console.writeline("base method call");
}
}///类描述:override了基类的virtual方法
///
///第一种使用方法:转型为父类
///sharp s = new circle()
///s.methodvirtual();
///s.method();
///因为子类已经override了父类的methodvirtual,所以即使子类转型为了sharp,调用的还是子类的方法
///out put:
///circle override methodvirtual
///base method call
///
///第二类使用方法:使用子类本身
///这很好理解,全部输出的是子类的方法
///circle circle = new circle();
///circle.methodvirtual();
///circle.method();
///out put:
///circle override methodvirtual
///base method call
class circle : shape
{
public override void methodvirtual()
{
console.writeline("circle override methodvirtual");
}
}///类描述:未做任何处理
///
///第一种使用方法
///sharp s = new rectangle()
///s.methodvirtual();
///s.method();
///out put:
///base methodvirtual call
///base method call
///
///第二类使用方法:使用子类本身
///这很好理解,全部输出的是子类的方法
///rectangle rectangle = new rectangle();
///rectangle.methodvirtual();
///rectangle.method();
///out put:
///base methodvirtual call
///base method call
class rectangle : shape
{}
///类描述:new了基类的虚方法即非虚方法
///
///第一种使用方法
///sharp s = new triangle()
///s.methodvirtual();
///s.method();
///因为子类已经new了父类的方法,所以s输出的是父类的方法
///out put:
///base methodvirtual call
///base method call
///
///第二类使用方法:使用子类本身
///这很好理解,全部输出的是子类的方法
///triangle triangel = new triangle();
///triangel.methodvirtual();
///triangel.method();
///out put:
///triangle new methodvirtual
///triangle new method
class triangle : shape
{
public new void methodvirtual()
{
console.writeline("triangle new methodvirtual");
}public new void method()
{
console.writeline("triangle new method");
}
}///类描述:创建了基类方法相同的方法,未new及override
///编译器会做提示“隐藏继承”,并有如存在 new 关键字一样执行操作
///
///第一种使用方法
///sharp s = new diamond()
///s.methodvirtual();
///s.method();
///因为默认new的效果,所以输出和显式new修饰的一样
///out put:
///base methodvirtual call
///base method call
///
///第二类使用方法:使用子类本身
///这很好理解,全部输出的是子类的方法
///diamond diamond = new diamond();
///diamond.methodvirtual();
///diamond.method();
///out put:
///diamond default methodvirtual
///diamond default method
class diamond : shape
{
public void methodvirtual()
{
console.writeline("diamond default methodvirtual");
}public void method()
{
console.writeline("diamond default method");
}
}
上面代码的结果,如果基类使用接口代替,也是一样的效果。
主要注意看override或new了基类的方法后,调用方将子类对象转型为父类后的输出会有
相关文章
- 王者荣耀侦探能力大测试攻略 王者荣耀侦探能力大测试怎么过 11-22
- 无期迷途主线前瞻兑换码是什么 11-22
- 原神欧洛伦怎么培养 11-22
- 炉石传说网易云音乐联动怎么玩 11-22
- 永劫无间手游确幸转盘怎么样 11-22
- 无期迷途主线前瞻兑换码是什么 无期迷途主线前瞻直播兑换码介绍 11-22