1. 程式人生 > >隱藏基類成員與成員的虛擬過載的區

隱藏基類成員與成員的虛擬過載的區

 

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

namespace ConsoleApplication1
{
    class shape
    {
        protected double lenth = 0;
        protected double width = 0;
        public double Lenth
        {
            set { lenth = value; }
            get { return lenth; }
        }
        public double Width
        {
            set { width = value; }
            get { return width; }
        }
        public virtual double perimeter()
        {
            return 0;
        }
        public virtual double area()
        {
            return 0;
        }
    }
    class circle : shape
    {
        protected double r;//半徑
        public double R
        {
            set { r = value; }
            get { return r; }
        }
        public override double perimeter()
        {
            return Math.PI * r*2;
        }
        public override double area()
        {
            return Math.PI * r * r;
        }
    }
    class square:shape
    {
        public override double perimeter()
        {
            return 2 * (lenth + width);
        }
        public override double area()
        {
            return lenth * width;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            int x = 0;//預設矩形
            int y=0;//預設周長
            shape a = new shape();
            circle b = new circle();
            Console.Write("本應用可計算圓,矩形\n請輸入圖形型別:");
            if (Console.ReadLine() == "圓") 
            {
                x = 1;
                b.R = double.Parse(Console.ReadLine());
            }
            else a.Lenth = double.Parse(Console.ReadLine());
            Console.WriteLine("可計算周長,面積\n請輸入計算型別");
            if(Console.ReadLine() == "面積")y=1;
            if (x == 1)
            {
                if (y == 0) Console.WriteLine( "周長為{0}",b.perimeter());
                else Console.WriteLine("周長為{0}",b.area()); 
            }
            else
            {
                if (y == 0)  Console.WriteLine("周長為{0}",a.perimeter());
                else Console.WriteLine("周長為{0}", a.area()); 
            }
        }
    }
}


隱藏基類成員與成員的虛擬過載的區別

  

    隱藏基類成員 關鍵詞:new(關鍵詞修飾)

    成員的虛擬和過載:多型性 virtual/override

    區別:

             “虛擬與過載在執行時會根據物件的實際型別來進行呼叫,而不像new關鍵字修飾的方法那樣根據宣告型別來呼叫”

——《c#語言程式設計基礎》P139

             由字面上可知,多型性是指對不同型別的派生類方法的描述。

             隱藏基類成員僅適用於直接使用派生類時,隱藏基類同名方法;虛擬過載可在基類按照不同條件直接自動匹配呼叫相應的方法。

            (不知道啥時候寫的文章了,直接發出來好了)