C#中的virtual,abstract,override和new关键字小结

C#中的virtual,abstract,override和new关键字

C#中virtual,abstract,override用于方法重载,子类覆盖了父类的相同方法,父类中的实现不可能再被外面调用。
new的作用是投影(shadowing),子类隐藏了父类的相同方法,通过强制类型转换外面还可以调用父类的实现。

下面是重载的例子

Code:

class Parent
    {
        public virtual Parent foo()
        {
            System.Console.WriteLine("Parent.foo()");
            return this;
        }
    }

   class Child : Parent
    {
        public override Parent foo()
        {
            System.Console.WriteLine("Child.foo()");
            return this;
        }
    }

Test:

class Program
{
      static void Main(string[] args)
      {
          Child c =new Child();
          c.foo();
          ((Parent)c).foo();
      }
}

Result:
Child.foo()
Child.foo()

下面是投影的例子

Code:
class Parent
{
public Parent foo()
{
System.Console.WriteLine(“Parent.foo()”);
return this;
}
}

class Child : Parent
{
    public new Child foo()
    {
        System.Console.WriteLine("Child.foo()");
        return this;
    }
}

Test:

class Program
{
     static void Main(string[] args)
     {
         Child c =new Child();
         c.foo();
         ((Parent)c).foo();
     }
 }

Result:
Child.foo()
Parent.foo()

重载的规则:

父类提供实现,则父类使用virtual关键字
父类不提供实现,则父类自身和相关方法使用abstract关键字,此时子类必须提供实现
子类重载需使用override关键字,如省略当作new(即投影)处理,并且编译器报编译警告
重载时子类方法不能改写返回值类型
子类中可以使用base关键字引用父类的实现

投影的规则:

父类必须提供实现(甚至可以有virtual关键字)
子类应该使用new关键字,如省略也当作new处理,但编译器报编译警告
投影时子类方法可以改写返回值类型
子类中可以使用base关键字引用父类的实现

除此以外还有一种接口投影的情况,通过接口投影可以新定义一个和接口定义同名同参但不同返回类型的函数。比如:
Code:

interface MyInterface
{
    Object foo();
}

 class MyImp : MyInterface
 {
     Object MyInterface.foo()
     {
         System.Console.WriteLine("MyInterface.foo()");
         return null;
     }

    public MyImp foo()
    {
        System.Console.WriteLine("foo()");
        return null;
    }
}

Test:

MyImp myImp = new MyImp();
myImp.foo();
((MyInterface)myImp).foo();

Result:
foo()
MyInterface.foo()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值