OOP是開發程序中必須要使用的,而且面試的時候也經常會問到這個問題。應該很多人都知道,OOP的三大特點:封裝、繼承、多態。
首先,什麼是OOP,OOP: Object Oriented Programming,面向對象的程序設計。所謂“對象”在顯式支持面向對象的語言中,一般是指類在內存中裝載的實例,具有相關的成員變量和成員函數(也稱為:方法)。打個比方說,把一個人看做一個對象,那麼這個人的年齡、身高、體重等等屬性則為成員變量,這個人的特長、愛好(比如我打籃球很厲害)則為成員函數。
OOP達到了軟件工程的三個目標:重用性、靈活性和可擴展性。最後還是從OOP的三大特點封裝、繼承、多態中體現。
封裝:類和對象本身就是封裝的體現,比如說:1、屬性封裝了字段;2、方法的多個參數封裝成一個對象;3、把一堆代碼封裝到一個類裡面;4、把一個功能封裝到幾個類中。總的來說就是將一些具有相同功能的代碼封裝到一個程序集中,只保留部分接口和方法與外部聯系。繼承增加了代碼的可擴展性。
繼承:子類自動繼承其父類中的屬性和方法,並可以添加新的屬性和方法或者對部分屬性和方法進行重寫,使子類變得更簡單。繼承增加了代碼的重用性。
多態:多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調用這些相同方法後卻可以獲得完全不同的結果,多態增加的代碼的靈活性。
面向對象編程技術的關鍵性觀念是它將數據及對數據的操作行為放在一起,作為一個相互依存、不可分割的整體——對象。對於相同類型的對象進行分類、抽象後,得出共同的特征而形成了類。面向對象編程就是定義這些類。類是描述相同類型的對象集合。類定義好之後將作為數據類型用於創建類的對象。程序的執行表現為一組對象之間的交互通信。對象之間通過公共接口進行通信,從而完成系統功能。類中聲明的public成員組成了對象的對外公共接口。
封裝:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace What_is_OOP { class Program { static void Main(string[] args) { Recode(new Student() { Name = "MaxJoker", Age = 22, Phone = "1808208820" });//使用對象初始化器構建一個對象闖入方法中 } static void Recode(string name, int age, string phone) { } //用這種方法寫調用起來麻煩 static void Recode(Student student) { } //這裡體現將方法中的多個字段封裝成一個對象 } class Student { public string Name { get; set; } public int Age { get; set; } public string Phone { get; set; } } class Person { //定義一個字段 private int _age; //定義一個屬性,此時屬性封裝了字段 public int Age { get { return _age; } set { //對年齡進行限制,這就是在調用對象是不直接使用字段的原因。 if (value < 0 || value > 150) { throw new Exception("年齡過大"); } else { _age = value; } } } } }View Code
繼承:繼承具有單根性和傳遞性,單根性:只能有一個父類;傳遞性:比如一個方法可以從父類的父類中獲取。繼承的話想對好理解,就寫一寫怎樣調用父類中的帶參數的構造函數和使用this調用自己的構造函數。
class Person { public Person(string name,int age,string phone) { this.Name = name; this.Age = age; this.Phone = phone; } public string Name { get; set; } public int Age { get; set; } public string Phone { get; set; } } class Student : Person { //在子類的構造函數中通過:base()的方式,明確指明要調用父類中的那個構造函數 public Student(string name, int age, string phone,string studentCode) : base(name, age, phone) //:base表示調用父類構造函數,父類中的構造函數是不能被繼承的,只能通過子類去調用他 { this.StudentCode = studentCode; } public string StudentCode { get; set; } }View Code
class Person { public Person(string name, int age, string phone) : this(name, age, phone, string.Empty) //使用this調用自己的構造函數 { //this.Name = name; //this.Age = age; //this.Phone = phone; } public Person(string name, int age) : this(name, age, String.Empty, String.Empty) { //this.Name = name; //this.Age = age; } public Person(string name, int age, string phone, string email) { this.Name = name; this.Age = age; this.Phone = phone; this.Email = email; } public string Name { get; set; } public int Age { get; set; } public string Phone { get; set; } public string Email { get; set; } }View Code
多態:
class Program { static void Main(string[] args) { Person p1=new American(); Person p2=new Chinese(); p1.SayNationality(); p2.SayNationality(); Console.ReadKey(); } } class Person { public string Name { get; set; } public int Age { get; set; } public string Phone { get; set; } public string Email { get; set; } public virtual void SayNationality() { } } class American : Person { public override void SayNationality() { Console.WriteLine("我是美國人"); } } class Chinese:Person { public override void SayNationality() { Console.WriteLine("我是中國人"); } }View Code