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方法。如果
在实现接口的父类中没有找到接口方法,则在父类的父类往上查找,直到找到为止,执
行该方法。(同理,也不可能出现找不到的情况,不然编译通不过)
如果一个类的 无参构造函数为 私有,则这个类不能被继承的。