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
}
}