接口、抽象类、虚方法、重写、重载的关系

1、重载

重载就是在同一个类中,方法名相同,参数列表不同。参数列表不同包括:参数的个数不同,参数类型不同等。返回的数据类型可以不相同。代码如下:

public class ClassA
{
  public void Search()
  public string Search(int a)
  public int Search(string b)
}

也就是说,他们虽然名字相同,但是方法都是独立的,毫无关系的。

2、重写就是子类重写父类的方法,父类声明一个虚方法,子类可以选择重写与否。如果重写,调用ClassB中的search方法就是调用子类重写过的方法,也就是ClassB的方法。如果不重写,调用ClassC中的search方法就是调用继承的父类中的方法,也就是ClassC中的方法。这种非抽象类的方法重写,可以被重写的方法必须在修饰符后面加上 virtual 关键字,重写的方法也需要在修饰符后面加上 override 关键字。代码如下:

    public class ClassA
    {
        public virtual string Search()
        {
            return "A";
        }
    }
    public class ClassB : ClassA
    {
        public override string Search()
        {
            return "B";
        }
    }
    public class ClassC : ClassA
    {
    }

3、抽象也可以用来实现方法的重写。但是抽象方法必须放在抽象类中,继承抽象类的子类必须实现抽象类中的抽象方法,抽象类中的非抽象方法不用强制实现。抽象类中的抽象方法没有主体,且抽象类无法被实例化,只能通过子类继承调用。声明一个抽象类和抽象方法都需要在修饰符后加上 abstract 关键字,子类实现(重写)抽象方法,需要在修饰符后加上 override 关键字。代码如下:

    public abstract class ClassA
    {
        public abstract string Search();
        public void test() { }
    }
    public class ClassB : ClassA
    {
        public override string Search()
        {
            return "B";
        }
    }

4、接口的实现和抽象类类似,继承接口的类也必须实现接口中的方法。不过不同的是,接口中的方法不需要修饰符,不能直接在接口中实现(方法不能有主体),不需要关键字。而且一个类只能继承一个类,却可以继承多个接口。代码如下:

    public interface ITest
    {
        string Search();
    }
    public class ClassB : ITest
    {
        public string Search()
        {
            return "";
        }
    }
posted @ 2020-01-15 16:46  梁仕博  阅读(382)  评论(0编辑  收藏  举报