CLASS與INTERFACE的應用實例(一)


Step 1:建立一個「主控台應用程式」

Step 2:新增六個CLASS,分別為「Car.cs」、「Toyota.cs」、「Mazda.cs」,新增方法如下


Step 3:新增「Vehicle.cs」Interface,新增方法如下

Program.cs

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

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            #region Car.cs 的物件成員
            Car CarA = new Car("TOYOTA", "CAMRY", "AMG-1688", "2004", 120000);//宣告CAR類別的物件成員
            Console.WriteLine(CarA);//也可以寫 Console.WriteLine(CarA.ToString());
            Console.WriteLine("===================================================");
            Console.WriteLine(CarA.Make);//廠牌
            Console.WriteLine(CarA.Type);//車型(e.g:Camry、Altis)
            Console.WriteLine(CarA.Registration);//車牌號碼
            Console.WriteLine(CarA.Year);//年份
            Console.WriteLine(CarA.CurrentValue);//殘值
            #endregion
            Console.WriteLine("");
            #region Toyota.cs 的物件成員
            Toyota CarB = new Toyota("Yaris", "AMG-1677", "2004", 120000);//宣告TOYOTA類別的物件成員
            Console.WriteLine(CarB);//也可以寫 Console.WriteLine(CarB.ToString());
            #endregion
            Console.WriteLine("");
            #region Mazda.cs 的物件成員
            Mazda CarC = new Mazda("CX-9", "AMG-1699", "2004", 120000);//宣告MAZDA類別的物件成員
            Console.WriteLine(CarC);//也可以寫 Console.WriteLine(CarC.ToString());
            #endregion
            Console.WriteLine("");
            #region 主要是 Toyota 的物件成員,但是 Car 的實體物件(Instance Object),原因如下
            Car CarD = new Toyota("ALTIS", "AMG-1799", "2004", 120000);
            Console.WriteLine(CarD);//也可以寫 Console.WriteLine(CarD.ToString());
            Console.WriteLine(CarD.Moving());
            /*
             因為 CarD 主要是 Toyota 的物件成員,但又並非完全是
             所以若要使用 ONLY IN Toyota.cs 的 Function,亦即該 Function 僅存在於子類別卻不存在於父類別時候
             則會有錯誤
             若真的要使用 ONLY IN Toyota.cs 的 Function,前面需「(子類別名稱)子類別成員」做轉型的動作
             */
            //Console.WriteLine(CarD.OnlyToyotaCanDo());//這樣會有錯
            Console.WriteLine(((Toyota)CarD).OnlyToyotaCanDo());
            #endregion
            Console.WriteLine("");
            #region 用 var 宣告 Toyota 的物件成員
            var CarE = new Toyota("ALTIS", "AMG-1777", "2004", 120000);
            Console.WriteLine(CarE);//也可以寫 Console.WriteLine(CarD.ToString());
            Console.WriteLine(CarE.Moving());
            /*
             這樣的寫法已經是 Toyota 的物件成員了,故不用再轉型即可使用 ONLY IN Toyota.cs 的 Function
             */
            //Console.WriteLine(((Toyota)CarE).OnlyToyotaCanDo());//這樣會有錯
            Console.WriteLine(CarE.OnlyToyotaCanDo());
            #endregion


            Console.Read();            
        }
    }
}

◎ INTERFACE

Vehicle.cs

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

namespace Sample
{
    interface Vehicle
    {
        /// <summary>
        /// Interface 裡面的 Function 及 變數 不能加任何存取修飾詞
        /// 若任何類別要Implement Interface,則必須實作Interface裡面的所有 Function 及 變數
        /// </summary>
        /// <returns></returns>
        string Moving();
    }
}

◎ CLASS

Car.cs

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

namespace Sample
{
    class Car : Vehicle//Implement Interface
    {
        #region Field
        //宣告 CAR 類別的屬性(Field)
        private string _make;//廠牌
        private string _type;//車型(e.g:Camry、Altis)
        private string _registration;//車牌號碼
        private string _year;//年份
        #endregion

        #region Property (Getter、Setter)
        public string Year
        {
            get { return _year; }
            set { this._year = value; }
        }

        public string Make { get { return _make; } }
        public string Type { get { return _type; } }
        public string Registration { get { return _registration; } }

        /// <summary>
        /// 以下寫法代表
        /// private double _CurrentValue;
        /// 
        /// public string CurrentValue
        /// {
        ///    get { return _CurrentValue; }
        ///    set { this._CurrentValue = value; }
        /// }
        /// </summary>
        public double CurrentValue { get; set; }
        #endregion

        #region Constructor (建構式)
        /// <summary>
        /// 備註:Constructor (建構式) 存取修飾詞一定要設為「public」,「protected」、「private」都不行
        /// </summary>
        /// <param name="_make">廠牌</param>
        /// <param name="_type">車型(e.g:Camry、Altis)</param>
        /// <param name="_registration">車牌號碼</param>
        /// <param name="_year">年份</param>
        /// <param name="_currentValue">殘值</param>
        public Car(string _make, string _type, string _registration, string _year, double _currentValue)
        {
            this._make = _make;//廠牌
            this._type = _type;//車型(e.g:Camry、Altis)
            this._registration = _registration;//車牌號碼
            Year = _year;//年份
            CurrentValue = _currentValue;//殘值
        }
        #endregion

        public override string ToString()
        {
            //return String.Format("Car Make: {0}\n" +
            //                     "Car Type: {1}\n" +
            //                     "Car Registration: {2}\n" +
            //                     "Car Year: {3}\n" +
            //                     "Current Value: {4}", _make, _type, _registration, _year, CurrentValue);
            return $"廠牌: {_make}\n" +
                $"車型: {_type}\n" +
                $"車牌號碼: {_registration}\n" +
                $"年份: {_year}\n" +
                $"殘值: {CurrentValue}";
        }

        /// <summary>
        /// Implement Interface的Function,其存取修飾詞最好養成什麼都不加,或設為「public」(僅適用於 Non-Explicit Interface)
        /// </summary>
        public virtual string Moving()
        {
            return " Car is moving.";
        }
    }
}

Toyota.cs

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

namespace Sample
{
    class Toyota : Car
    {
        #region Constructor (建構式)
        /// <summary>
        /// 備註:若父類別有自定義的 Constructor (建構式),則子類別一定要實作父類別的 Constructor (建構式)
        /// </summary>
        /// <param name="_make">廠牌</param>
        /// <param name="_type">車型(e.g:Camry、Altis)</param>
        /// <param name="_registration">車牌號碼</param>
        /// <param name="_year">年份</param>
        /// <param name="_currentValue">殘值</param>
        public Toyota(string _type, string _registration, string _year, double _currentValue) : base("Toyota", _type, _registration, _year, _currentValue)
        {
        }
        #endregion
        #region Destructor (解構式)
        /// <summary>
        /// 備註:Destructor不能加任何存取修飾詞,就連「public」「protected」「private」都不能加
        /// </summary>
        ~Toyota()
        {

        }
        #endregion
        #region Function
        #region 子類別自定義的Function(沒有跟父類別重複)
        public string OnlyToyotaCanDo()
        {
            return "這個 Function ONLY " + this.Make + " 可以使用";
        }
        #endregion
        #region Override
        /// <summary>
        /// 備註:子類別若需要Override則須滿足以下條件
        /// 1. 父類別的 Function 的存取修飾詞需設為「public」、「protected」,不能為「private」
        /// 2. 須加上 virtual 字眼。(e.g:public virtual string fnNAME() {} )
        /// </summary>
        /// <returns></returns>
        public override string Moving()
        {
            return this.Make + " 的車子已經動了";
        }
        #endregion
        #endregion
    }
}

Mazda.cs

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

namespace Sample
{
    class Mazda : Car
    {
        #region Constructor (建構式)
        /// <summary>
        /// 備註:若父類別有自定義的 Constructor (建構式),則子類別一定要實作父類別的 Constructor (建構式)
        /// </summary>
        /// <param name="_make">廠牌</param>
        /// <param name="_type">車型(e.g:Camry、Altis)</param>
        /// <param name="_registration">車牌號碼</param>
        /// <param name="_year">年份</param>
        /// <param name="_currentValue">殘值</param>
        public Mazda(string _type, string _registration, string _year, double _currentValue) : base("Mazda", _type, _registration, _year, _currentValue)
        {
        }
        #endregion
        #region Destructor (解構式)
        /// <summary>
        /// 備註:Destructor不能加任何存取修飾詞,就連「public」「protected」「private」都不能加
        /// </summary>
        ~Mazda()
        {

        }
        #endregion
        #region Function
        #region Override
        /// <summary>
        /// 備註:子類別若需要Override則須滿足以下條件
        /// 1. 父類別的 Function 的存取修飾詞需設為「public」、「protected」,不能為「private」
        /// 2. 須加上 virtual 字眼。(e.g:public virtual string fnNAME() {} )
        /// </summary>
        /// <returns></returns>
        public override string Moving()
        {
            return this.Make + " 的車子已經動了";
        }
        #endregion
        #region 子類別自定義的Function(沒有跟父類別重複)
        public string OnlyMazdaCanDo()
        {
            return "這個 Function ONLY " + this.Make + " 可以使用";
        }
        #endregion
        #endregion
    }
}

results matching ""

    No results matching ""