一.父类,子类的继承和虚方法重写

 

 class Program
    {
        static void Main(string[] args)
        {
            Person objperson= new Person ();//实例person类
            objperson.My();
            objperson.num();
 
            Student objstudent= new Student();//实例person类
            objstudent.My();
            objstudent.num();

        }


  public  class Person   //父类
    {
     
        public string My()  
        {
            return "我是人类";
        }
        public virtual string num()
        {
            return "我人类没有";
        }
    } 

 public class Student:Person    //子类
    {

       public override string num()
       {
           return "我学生没有";
       }


}
 

结果显示:

 

二.什么时候用抽象方法?虚方法和抽象的区别

方法里边没有抽象体,不需要对其他事物进行描述,但是其他类都有这个行为,这个时候采用抽象方法。

里面没有具体的方法体,  继承者,负责重写里面的方法

抽象方法无法实例化,抽象类只能用作基类

1、Virtual方法(虚方法)

  virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:

  情况1:在父类中定义了virtual方法,但在子类中没有重写该虚方法。那么在对子类实例的调用中,该虚方法使用的是父类定义的方法

  情况2:在父类中定义了virtual方法,然后在子类中使用override重写该方法。那么在对子类实例的调用中,该虚方法使用的是子类重写的方法

2、Abstract方法(抽象方法)

abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在子类中使用override关键字来实现

接口和抽象类最本质的区别:抽象类是一个不完全的类,是对对象的抽象,而接口是一种行为规范。

a)     virtual修饰的方法必须有方法实现(哪怕只有一对大括号),abstract修饰的方法不能有实现。

b)    virtual可以被子类重写,abstract必须被子类重写

c)     如果类中的某一函数被abstact修饰,则类名也必须用abstact修饰

d)    Abstract修饰的类不能被创建实例。

e)     C#中如果准备在子类重写父类的方法,则该方法在父类中必须用virtual修饰,在子类中必须用overide修饰,避免了程序员在子类中不小心重写了父类父类方法。

注:用abstract修饰的类只能被继承不能够被实例化。

 

三.接口

class Program
    {
        static void Main(string[] args)
        {
            Fly objfly=new Person();   //接口实例化
            objfly.fly();
            objfly.run();
 
            objfly= new Student(); //接口实例化
            objfly.fly();
            objfly.run();

        }


  public  class Person:Fly  //父类
    {
     
        public string My()  
        {
            return "我是人类";
        }
        public virtual string num()
        {
            return "我人类没有";
        }
       string Fly.fly()  //接口实现方法
        {
            return "我是人类,我会飞";
        }

        string Fly.run()   //接口实现方法
        {
            return "我是人类,我在工作";
        }
    } 

 public class Student:Person,Fly    //子类
    {

       public override string num()
       {
           return "我学生没有";
       }
        string Fly.fly()
        {
            return "我是学生,我会飞";
        }

        string Fly.run()
        {
            return "我是学生,我在工作";
        }
   }

  public  interface Fly
    {
        string fly();
        string run();
    }

}

结果:

 

其中接口,和继承接口的类实例化,可以做到多态,以及替换,比如定义接口对象,可以初始化为任意继承它的实体对象,而能使用的方法和属性只有接口声明的那些。

 

接口属性定义使用

 

class Program
    {
        static void Main(string[] args)
        {
            Fly objfly=new Person();   //接口实例化
            objfly.Age = 18;
            objfly.AgeNow();
            Console.WriteLine(objfly.Age.ToString());
 
            objfly= new Student(); //接口实例化
             objfly.Age = 10;
            objfly.AgeNow();
            Console.WriteLine(objfly.Age.ToString());

        }


  public  class Person:Fly  //父类
    {
     
        public string My()  
        {
            return "我是人类";
        }
        public virtual string num()
        {
            return "我人类没有";
        }
       string Fly.fly()  //接口实现方法
        {
            return "我是人类,我会飞";
        }

        string Fly.run()   //接口实现方法
        {
            return "我是人类,我在工作";
        }
        int Fly.Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
            }
        }

        void Fly.AgeNow()
        {
            Console.WriteLine("我是人类年龄:" + age);
            age = age + 1;
        }
    } 

 public class Student:Person,Fly    //子类
    {

       public override string num()
       {
           return "我学生没有";
       }
        string Fly.fly()
        {
            return "我是学生,我会飞";
        }

        string Fly.run()
        {
            return "我是学生,我在工作";
        }
          int Fly.Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
            }
        }

        void Fly.AgeNow()
        {
            Console.WriteLine("我是学生年龄:" + age);
            age = age + 1;
        }
   }

  public  interface Fly
    {

     int Age
      {
          get;
          set;
      }
        void AgeNow();
        string fly();
        string run();
    }

}

 

最后结果:

 

posted on 2019-07-01 16:17  我是药丸  阅读(999)  评论(0编辑  收藏  举报