OOP之C#設計及其UML(反向工程)


  現在總結一下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反向生成了“類圖”,如下所示:

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM