Fork me on GitHub

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反向生成了“类图”,如下所示:

  

posted @ 2015-11-21 23:16  晨光iABC  阅读(2382)  评论(3编辑  收藏  举报