現在總結一下C#類關鍵字(virtual、abstract、override、new、sealed)的使用(以C#代碼體現),並再次熟悉一下OOP思想,使用UML工具EA(Enterprise Architect 7.5)建立其反向工程,生成其UML。
abstract聲明抽象類、抽象方法:
- 抽象方法所在類必須為抽象類;
- 抽象類不能直接實例化,必須由其派生類實現;
- 抽象方法不包含方法主體,必須由派生類以override方式實現此方法;
virtual標記方法為虛方法:
- 可在派生類中以override覆蓋此方法
- 不覆蓋也可由對象調用
- 無此標記的方法(也無其他標記),重寫時需用new隱藏原方法
abstract 與 virtual : 方法重寫時都使用 override 關鍵字,interface中的方法和abstract方法都要求實現
sealed關鍵字:
- 當對一個類應用 sealed 修飾符時,此修飾符會阻止其他類從該類繼承,類似於Java中final關鍵字;
下面為具體的C#代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace UserNameSpace { /// <summary> /// 枚舉Sex /// </summary> public enum Sex { Male = '男', Female = '女' } /// <summary> /// 結構體StudentParams /// </summary> public struct StudentParams { public int id; public string name; public Sex sex; public string grade; public string major; } /// <summary> /// 接口 /// </summary> interface IPeople { string Name { get; set; } Sex Sex { get; set; } short Age { get; set; } void Eat(); } interface ITeacher : IPeople { void Teach(); } interface IStudent : IPeople { void Study(); } /// <summary> /// 抽象基類 /// </summary> abstract class People : IPeople { private string name; private Sex sex; private short age; public string Name { get { return name != null ? name : "NA"; } set { if (value != "") { name = value; } } } public Sex Sex { get { return sex; } set { value = sex; } } public short Age { get { return age > 0 ? age : (short)0; } set { if (value >= 0) { age = value; } } } /// <summary> /// 虛方法 /// </summary> public virtual void Eat() { Console.WriteLine("People eat."); } /// <summary> /// 抽象方法,必須被派生類覆寫,則People為抽象類 /// </summary> public abstract void Sleep(); } class Teacher : People, ITeacher { /// <summary> /// 重寫基類虛方法 /// </summary> public override void Eat() { Console.WriteLine("Teacher eat."); } /// <summary> /// 重寫基類抽象方法 /// </summary> public override void Sleep() { Console.WriteLine("Teacher sleep."); } public void Teach() { Console.WriteLine("Teacher teach."); } } sealed class Master : Teacher { protected void Manage() { } } class Student : People, IStudent { StudentParams param; /// <summary> /// 重寫基類虛方法 /// </summary> public override void Eat() { Console.WriteLine("Student eat."); } /// <summary> /// 重寫基類抽象方法 /// </summary> public override void Sleep() { Console.WriteLine("Student sleep."); } public void Study() { Console.WriteLine("Student study."); } } class Program { static void Main(string[] args) { Teacher teacher = new Teacher(); ITeacher itea = (ITeacher)teacher; itea.Eat(); Student stu = new Student(); IStudent istu = (IStudent)stu; istu.Eat(); Console.ReadKey(); } } }
我根據上面的代碼,利用UML工具EA反向生成了“類圖”,如下所示: