【物件導向依賴關係概念總結】物件導向程式設計的五種依賴關係

2023-05-08 12:00:25

目錄

 

簡介

繼承關係

聚合關係

組合關係

關聯關係

依賴關係

總結


 

簡介

        物件導向程式設計中,要實現複雜的模組化系統,需要將系統劃分為多個物件並組織它們之間的關係,這就涉及到常說的物件導向五大依賴關係。這五種依賴關係分別是:繼承、聚合、組合、關聯和依賴。本文將逐一介紹這五種依賴關係。

繼承關係

        繼承是一種基於類的依賴關係,允許一個類從一個或多個基礎類別繼承屬性和方法。繼承關係建立在共性和特性之間,通常使用 is-a 關係來描述,即子類 is a 父類別的一種特殊形式。

通過繼承,一個子類可以擁有父類別的所有屬性和方法,並能夠擴充套件和修改這些屬性和方法。通過繼承,我們可以避免程式碼冗餘,減少程式碼複製和貼上,並提高程式碼重用性。

在繼承關係中,應該遵循以下原則:

  • 子類擴充套件或重寫基礎類別的屬性和方法;
  • 子類不能直接修改基礎類別的實現方式;
  • 子類應該儘量簡化和區分基礎類別的屬性和方法。
    internal abstract class Animal
    {
        public Animal()
        {
            
        }
        protected string Name { get; set; }

        public abstract void Call();
    }
    /// <summary>
    /// 繼承Animal
    /// </summary>
    internal class Cat : Animal
    {
        public Cat()
        {
            //使用繼承Animal的Name屬性
            Name = "金毛";
        }
        //重寫Animal的Call方法
        public override void Call()
        {
            Console.WriteLine($"{Name}在喵喵叫");
        }
    }
    /// <summary>
    /// 繼承Animal
    /// </summary>
    internal class Dog : Animal
    {
        public Dog()
        {
            //使用繼承Animal的Name屬性
            Name = "金毛";
        }
        //重寫Animal的Call方法
        public override void Call()
        {
            Console.WriteLine($"{Name}在汪汪叫");
        }
    }

聚合關係

        聚合關係是一種整體與部分的關係,即整體可以由部分構成,部分可以獨立存在,且整體與部分是 「has-a」 關係。主要體現的是生命週期的不同,部分的生命週期可以與整體不同,整體對於部分有著控制和管理。

        下面的例子體現聚合關係,教師擁有多個學生,控制並管理多個學生,而學生可以獨立存在,生命週期教師與學生可以不同。

    // 教師類
    public class Teacher
    {
        public string Name { get; set; }

        public Teacher(string name)
        {
            Name = name;
        }

        public void Teach(List<Student> students)
        {
            Console.WriteLine($"{Name}老師在教{students.Count}個學生");

            foreach (var student in students)
            {
                student.Learn();
            }
        }
    }
    //學生類
    public class Student
    {
        public string Name { get; set; }

        public Student(string name)
        {
            Name = name;
        }

        public void Learn()
        {
            Console.WriteLine($"{Name}在學習");
        }
    }

組合關係

        組合關係也是一種整體與部分的關係,與聚合關係不同的是,部分不能獨立存在,只能作為整體的一部分存在。例如,一本書由封面、目錄、正文和封底等部分構成,如果沒有這些部分之一,就不能稱之為完整的書。

        組合關係強調整體與部分的生命週期統一, 整體包含部分,同時部分只能屬於一個整體。組合關係是一種強依賴關係,整體控制和管理了部分,整體的生命週期結束時,部分也隨之銷燬。

        下面的例子,書包含封面、目錄、正文和封底,書與封面、目錄、正文和封底的生命週期一同結束。封面、目錄、正文和封底不能獨立存在。

    // 書類
    public class Book
    {
        public string Title { get; set; }
        public Cover BookCover { get; set; }
        public TableOfContents Contents { get; set; }
        public Text Body { get; set; }
        public BackCover BookBackCover { get; set; }

        public Book(string title, string coverImage, string[] chapters, string[] pages, string backCoverImage)
        {
            Title = title;
            BookCover = new Cover(coverImage);
            Contents = new TableOfContents(chapters);
            Body = new Text(pages);
            BookBackCover = new BackCover(backCoverImage);
        }

        public void Read()
        {
            Console.WriteLine($"這本書叫{Title}");
            BookCover.Display();
            Contents.Display();
            Body.Display();
            BookBackCover.Display();
        }
    }

    // 封面類
    public class Cover
    {
        private string _coverImage;

        public Cover(string image)
        {
            _coverImage = image;
        }

        public void Display()
        {
            Console.WriteLine($"這本書的封面是:{_coverImage}");
        }
    }

    // 目錄類
    public class TableOfContents
    {
        private IList<string> _tableOfContentsList;

        public TableOfContents(string[] chapters)
        {
            _tableOfContentsList = chapters;
        }

        public void Display()
        {
            Console.WriteLine($"這本書目錄:");
            for (int i = 0; i < _tableOfContentsList.Count; i++)
            {
                Console.WriteLine($"{i} 1 .{_tableOfContentsList[i]}");
            }
        }
    }

    // 正文類
    public class Text
    {
        private IList<string> _pageList;

        public Text(string[] pages)
        {
            _pageList = pages;
        }

        public void Display()
        {
            Console.WriteLine($"這本書的正文:");
            for (int i = 0; i < _pageList.Count; i++)
            {
                Console.WriteLine($"Page {(i + 1)} :  {_pageList[i]}");
            }
        }
    }

    // 封底類
    public class BackCover
    {
        private string _backCoverImage;

        public BackCover(string backImage)
        {
            _backCoverImage = backImage;
        }

        public void Display()
        {
            Console.WriteLine($"這本書的封底是:{_backCoverImage}");
        }
    }

關聯關係

        關聯關係是一種物件之間的聯接關係,用於描述兩個物件之間有互動關係。關聯關係可以是單向的或雙向的,可以是強關聯、中等關聯或弱關聯。

        強關聯表示兩個物件之間的依賴關係比較緊密,通常使用物件成員變數來實現,如一個人與其身份證號之間就是強關聯。中等關聯表示兩個物件之間能互相存取,但是依賴程度不是很緊密。弱關聯表示兩個物件之間關聯程度較小。

        下面例子中,教師類需要有學生才能教學,學生類需要有教師才能學習。於是二者之間有了關聯,互相之間需要對方來完成資訊的互動。

    // 學生類
    public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Student(string name, int age)
        {
            Name = name;
            Age = age;
        }

        public void Learn(Teacher teacher)
        {
            Console.WriteLine($"{Name}學生在學{teacher.Name}老師的課程");
        }
    }

    // 教師類
    public class Teacher
    {
        public string Name { get; set; }
        public string Subject { get; set; }

        public Teacher(string name, string subject)
        {
            Name = name;
            Subject = subject;
        }

        public void Teach(Student student)
        {
            Console.WriteLine($"{Name}老師在教{student.Name}學生{Subject}");
        }
    }

依賴關係

        依賴關係是一種類之間的關係,表示一個類依賴於另一個類。依賴關係通常體現為一個類在方法內使用了另一個類的物件作為引數或區域性變數。如果一個類的程式碼依賴於另一個類,就意味著當另一個類發生改變時,這個類也可能受到影響。

        依賴關係可以幫助我們提高程式碼複用性,通過在一個類中使用另一個類,可以有效地實現程式碼的模組化和重用。

        下面例子中,司機類有一個開車的行為,而司機開車需要依賴於車才能完成自身的行為。所以司機依賴於車。

    // 車類
    public class Car
    {
        public void Drive()
        {
            Console.WriteLine($"車正在行駛");
        }
    }

    // 司機類
    public class Driver
    {
        public void DriveCar(Car car)
        {
            car.Drive();
        }
    }

總結

        總的來說,物件導向程式設計中的五大依賴關係是程式設計師必須理解和掌握的一些基本概念。當我們設計、實現和維護物件導向系統時,需要合理使用這些依賴關係,以便讓我們的程式結構更為清晰、易懂、易擴充套件和易維護。