.NET virtual、override、new,interface、多态

在这里插入图片描述

1、Interface
规定行为的,就是能做什么【但不提供具体做什么,即不提供实现方法体,只是声明】,默认都是public,所以不需要用public修饰了。不然报错。
2、virtual
用virtual修饰的方法就是虚方法,跟抽象方法,区别,虚方法有方法体,抽象方法没有方法体。
virtual修饰的方法,子类可以进行重写(override)或者覆盖(new)

public interface IAnimal{
 	void Eat();
}
public class Dog:IAnimal{
	public void Eat(){
		 MessageBox.Show("Dog");
	}
}
IAnimal animal=new Dog();
animal.Eat();/// Dog
Dog dog = new Dog();
dog.Eat();/// Dog
 public interface IAnimal
    {
        void Eat();
    }
    public class Dog : IAnimal
    {
        public virtual void Eat()
        {
            MessageBox.Show("Dog");    
         }
    }
    public class Cat : Dog
    {
        public new void Eat()
        {
            MessageBox.Show("Cat");

        }
    }
  IAnimal animal = new Dog();
  animal.Eat();/// Dog
  Dog dog = new Dog();
  dog.Eat();
  IAnimal animal1 = new Cat();
  animal1.Eat();/// Dog
 public interface IAnimal
    {
        void Eat();
    }
    public class Dog : IAnimal
    {
        public virtual void Eat()
        {
            MessageBox.Show("Dog");    
         }
    }
    public class Cat : Dog
    {
        public override void Eat()
        {
            MessageBox.Show("Cat");

        }
    }
  IAnimal animal = new Dog();
  animal.Eat();/// Dog
  Dog dog = new Dog();
  dog.Eat();
  IAnimal animal1 = new Cat();
  animal1.Eat();/// Cat
 public interface IAnimal
    {
        void Eat();
    }
    public class Dog : IAnimal
    {
        public virtual void Eat()
        {
            MessageBox.Show("Dog");    
         }
    }
    public class Cat : Dog,IAnimal
    {
        public new void Eat()
        {
            MessageBox.Show("Cat");

        }
    }
  IAnimal animal = new Dog();
  animal.Eat();/// Dog
  Dog dog = new Dog();
  dog.Eat();
  IAnimal animal1 = new Cat();
  animal1.Eat();/// dog
 public interface IAnimal
    {
        void Eat();
    }
    public class Dog : IAnimal
    {
        public virtual void Eat()
        {
            MessageBox.Show("Dog");    
         }
    }
    public class Cat : Dog,IAnimal
    {
        public override void Eat()
        {
            MessageBox.Show("Cat");

        }
    }
  IAnimal animal = new Dog();
  animal.Eat();/// Dog
  Dog dog = new Dog();
  dog.Eat();
  IAnimal animal1 = new Cat();
  animal1.Eat();/// Cat  显示
 public interface IAnimal
    {
        void Eat();
    }
    public class Dog : IAnimal
    {
        public virtual void Eat()
        {
            MessageBox.Show("Dog");    
         }
    }
    public class Cat : Dog,IAnimal
    {     
    }
  IAnimal animal = new Dog();
  animal.Eat();/// Dog
  Dog dog = new Dog();
  dog.Eat();
  IAnimal animal1 = new Cat();
  animal1.Eat();/// dog 显示
总结

1、如果实例类【Dog、Cat】直接继承了接口,则查找实例类上有无接口方法,有则执行;没有,查找实例类父类中有无接口方法,如果有执行,没有继续向上查找,肯定能查找的,不然程序编译不通过
2、实例类如果没有直接继承接口,首先查找实例的父类,然后查找父类中有无接口方法,如果有,查看方法是否virtual,如果是,查看实例类有无重写这个方法,如果重写(override),则执行实例类中的方法,如果没有重写,直接调用父类的virtual的方法。

1) 实例类如果直接继承了接口,则查找实例类上有无接口方法,如果有,直接执行;
如果没有,查找实例类父类中有无接口方法,如果有,执行之。(不可能出现找不到的
情况,不然编译是通不过的)

public interface IA {
	void Print()
}
public class B:IA {
	void Print(){
	    print '11111'
	}
}
IA  b = new B();
b.Print();    //    1111111
-----------------------------------------
public interface IA {
	void Print()
}
public class C {
	void Print(){
	    print '222'
	}
}
public class B:IA ,C{
	
}
IA  b = new B();
b.Print();    //    2222

2) 实例类如果没有直接继承接口,首先查找实现接口的父类,然后查找父类中有无接
口方法,如果有,查看方法是否是virtual方法,如果是,查看实例类有无重写这个方
法,如果重写则调用实例类的方法,如果没有重写,直接调用父类的virtual方法。如果
在实现接口的父类中没有找到接口方法,则在父类的父类往上查找,直到找到为止,执
行该方法。(同理,也不可能出现找不到的情况,不然编译通不过)

如果一个类的 无参构造函数为 私有,则这个类不能被继承的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值