C#继承、覆盖和多态、抽象类

来源:互联网 发布:彩票源码程序 编辑:程序博客网 时间:2024/03/28 18:23

//-----------------------------------------------------------------继承-------------------------------------------

//myClass.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace myClass
    class myFirst{
        int value_myFirst;
        public myFirst(int f)
        {
            value_myFirst = f;  
        }
    }
   
    class mySecond : myFirst{
        int value_mySecond;
       
        //构造函数传递参数时,采用base关键字,s在base()中不需重新声明类型int
        public mySecond(int s)
            : base(s)  
        {
            value_mySecond = s;      
        }
    }
       
    class Program
    {
        static void Main(string[] args)
        {
          
        }
    }
}

 

 

//-----------------------------------覆盖与多态----------------------------------------

 

//myClass.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace myClass
{
    class myFirst
    {
        int value_myFirst;
        public myFirst(int f)
        {
            value_myFirst = f;
        }
        public void f1()
        {
            System.Console.WriteLine("myFirst.f1()!");
        }
        public virtual void f2()  //virtual也可以提到最前面
        {
            System.Console.WriteLine("myFirst.f2()!");
        }
    }

    class mySecond : myFirst
    {
        int value_mySecond;

        public mySecond(int s)
            : base(s)
        {
            value_mySecond = s;
        }
       
        //使用关键字new覆盖基类中的同名方法
        public new void f1()     //new也可以提到最前面
        {
            System.Console.WriteLine("mySeconde.f1()!");
        }
       
        //error当基类函数myFirst.f1()没有声明为virtual,abstract时不能override!
        //public override void f1() 
        //{
        //    System.Console.WriteLine("mySeconde.f1()!");
        //}
       
        //基类函数中虽然声明是virtual,但是仍然可以用new覆盖。
        //public new void f2()
        //{
        //    System.Console.WriteLine("mySeconde.f2()!");
        //}
       
        ////基类函数中虽然声明是virtual,用override覆盖。
        public override void f2()   //override也可以提到最前面
        {
            System.Console.WriteLine("mySeconde.f2()!");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            myFirst mf = new myFirst(1);
            mySecond ms = new mySecond(2);
            mf.f1(); //myFirst.f1()!
            mf.f2(); //myFirst.f2()!
            ms.f1(); //mySeconde.f1()!
            ms.f2(); //mySeconde.f2()!

            mf = ms; //向上转型之后
            mf.f1(); //myFirst.f1()!
           
            //mySeconde.f2()! 这是用override的运行结果;
            //如果是new那么,结果是myFirst.f2()!
            mf.f2();
        }
    }
}

//C#基类方法要声明为virtual,派生类覆盖时要用override;

 

//-----------------------------------抽象类----------------------------------------------------

 

 

上面已经说明,虽然基类方法声明为virtual,以便派生类用override覆盖,但是派生类仍然可以用
new关键字覆盖(不具有多态性)。
可以强制让派生类覆盖基类的方法,将基类方法声明为抽象的,采用abstract关键字。
抽象方法没有方法体,由派生类来提供。

如果派生类不实现基类的抽象方法,则派生类也需要声明为abstract类

//myClass.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace myClass{
   
    //类中只要存在抽象方法,就必须声明为抽象类
    abstract class myFirst 
    {
        int value_myFirst;
        public myFirst(int f)
        {
            value_myFirst = f;
        }
       
        //抽象方法没有方法体,以分号结尾。
        public abstract void f1();
       
        public void f2()
        {
            System.Console.WriteLine("myFirst.f2()!");
        }

        public virtual void f3()
        {
            System.Console.WriteLine("myFirst.f3()!");
        }
    }

    class mySecond : myFirst
    {
        int value_mySecond;

        public mySecond(int s)
            : base(s)
        {
            value_mySecond = s;
        }
       
        //覆盖基类抽象方法
        public override  void f1()  
        {
            System.Console.WriteLine("mySeconde.f1()!");
        }
        
        //覆盖基类一般方法    
        public new void f2()
        {
            System.Console.WriteLine("mySeconde.f2()!");
        }

        //覆盖基类虚拟方法
        public override void f3()
        {
            System.Console.WriteLine("mySecond.f3()!");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //抽象类和接口不能声明对象
            //myFirst mf = new myFirst(1); 
            mySecond ms = new mySecond(2);
           
            ms.f1();  //mySeconde.f1()!
            ms.f2();  //mySeconde.f2()!
            ms.f3();  //mySecond.f3()!

            //这里向上转型采用强类型转换的方式
            ((myFirst)ms).f1();   //mySeconde.f1()!
            ((myFirst)ms).f2();   //myFirst.f2()!
            ((myFirst)ms).f3();   //mySecond.f3()!
           
        }
    }
}

 

 

原创粉丝点击