日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#教程8:面向对象编程【02】

發布時間:2025/3/21 C# 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#教程8:面向对象编程【02】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

十、C#?表達式體構造函數

可以創建表達式主體的構造函數;它們提供了更簡潔、更好看的語法。

Program.cs

var u1 = new User("John Doe", "gardener"); var u2 = new User("Roger Roe", "driver");Console.WriteLine(u1); Console.WriteLine(u2);class User {private string Name;private string Occupation;public User(string Name, string Occupation) =>(this.Name, this.Occupation) = (Name, Occupation);public override string ToString() =>$"User {{ {this.Name} {this.Occupation} }}"; }

我們有一個帶有兩個參數的構造函數;它們被設置在一個表達式主體中。

public User(string Name, string Occupation) =>(this.Name, this.Occupation) = (Name, Occupation);

在這種情況下,this 關鍵字是必需的。

十一、C#?目標類型的new表達式

當類型已知時,目標類型的新表達式不需要為構造函數指定類型。此功能是在 C# 9.0 中引入的。

Program.cs

var u1 = new User("Roger", "Roe", "driver"); Console.WriteLine(u1);User u2 = new("John", "Doe", "gardener"); Console.WriteLine(u2);var users = new List<User> {new("Thomas", "Roove", "programmer"),new("Lucia", "Smith", "hair dresser"),new("Peter", "Holcomb", "painter"),new("Orlando", "Black", "actor"),new("Patrick", "Allen", "police officer") };foreach (var user in users) {Console.WriteLine(user); }class User {public string FirstName { get; set; }public string LastName { get; set; }public string Occupation { get; set; }public User(string FirstName, string LastName, string Occupation) =>(this.FirstName, this.LastName, this.Occupation) = (FirstName, LastName, Occupation);public override string ToString() =>$"User {{ {this.FirstName} {this.LastName} {this.Occupation} }}"; }

我們演示了用戶類型的目標類型新表達式。

var u1 = new User("Roger", "Roe", "driver");

var 關鍵字可用于省略賦值左側的類型聲明,因為編譯器可以從右側推斷類型。

User u2 = new("John", "Doe", "gardener");

目標類型的新表達式允許我們省略賦值右側的類型聲明。

var users = new List<User> {new("Thomas", "Roove", "programmer"),new("Lucia", "Smith", "hair dresser"),new("Peter", "Holcomb", "painter"),new("Orlando", "Black", "actor"),new("Patrick", "Allen", "police officer") };

在列表初始化器中,我們通過省略每個用戶的類型來節省一些擊鍵。

十二、C#類常量

C# 允許創建類常量。這些常量不屬于具體對象。他們屬于階級。按照慣例,常量用大寫字母書寫。

Program.cs

Console.WriteLine(Math.PI);class Math {public const double PI = 3.14159265359; }

我們有一個帶有 PI 常數的數學課。

public const double PI = 3.14159265359;

const 關鍵字用于定義常量。 public 關鍵字使其可以在類主體之外訪問。

$ dotnet run 3.14159265359

十三、C#繼承

????????繼承是一種使用已經定義的類來形成新類的方法。新形成的類稱為派生類,我們派生的類稱為基類。繼承的重要好處是代碼重用和降低程序的復雜性。派生類(后代)覆蓋或擴展基類(祖先)的功能。

Program.cs

new Human();class Being {public Being(){Console.WriteLine("Being is created");} }class Human : Being {public Human(){Console.WriteLine("Human is created");} }

在這個程序中,我們有兩個類。基礎存在類和派生人類類。派生類繼承自基類。

new Human();

我們實例化派生的 Human 類。

class Human : Being

在 C# 中,我們使用冒號 (:) 運算符來創建繼承關系。

$ dotnet run Being is created Human is created

????????我們可以看到兩個構造函數都被調用了。首先調用基類的構造函數,然后調用派生類的構造函數。

????????下面是一個更復雜的例子。

Program.cs

new Human();var dog = new Dog(); dog.GetCount();class Being {static int count = 0;public Being(){count++;Console.WriteLine("Being is created");}public void GetCount(){Console.WriteLine("There are {0} Beings", count);} }class Human : Being {public Human(){Console.WriteLine("Human is created");} }class Animal : Being {public Animal(){Console.WriteLine("Animal is created");} }class Dog : Animal {public Dog(){Console.WriteLine("Dog is created");} }

????????我們有四個類。繼承層次更復雜。人類和動物類繼承自存在類。 Dog 類直接繼承自 Animal 類,間接繼承自 Being 類。我們還引入了靜態變量的概念。

new Human();var dog = new Dog(); dog.GetCount();

我們從人類和狗類創建實例。我們調用 Dog 對象的 GetCount 方法。

static int count = 0;

我們定義了一個靜態變量。靜態成員是類的所有實例共享的成員。

Being() {count++;Console.WriteLine("Being is created"); }

每次實例化存在類時,我們將計數變量加一。這樣我們就可以跟蹤創建的實例數量。

class Animal : Being ...class Dog : Animal ...

動物繼承了存在,狗繼承了動物。間接地,狗也繼承了存在。

$ dotnet run Being is created Human is created Being is created Animal is created Dog is created There are 2 Beings

人類調用了兩個構造函數。 Dog 調用了三個構造函數。實例化了兩個存有。

我們使用 base 關鍵字顯式調用父級的構造函數。

Program.cs

var c = new Circle(2, 5, 6); Console.WriteLine(c);class Shape {protected int x;protected int y;public Shape(){Console.WriteLine("Shape is created");}public Shape(int x, int y){this.x = x;this.y = y;} }class Circle : Shape {private int r;public Circle(int r, int x, int y) : base(x, y){this.r = r;}public override string ToString(){return String.Format("Circle, r:{0}, x:{1}, y:{2}", r, x, y);} }

????????我們有兩個類:Shape 類和 Circle 類。 Shape 類是幾何形狀的基類。我們可以在這個類中加入一些常見形狀的共性,比如 x 和 y 坐標。

public Shape() {Console.WriteLine("Shape is created"); }public Shape(int x, int y) {this.x = x;this.y = y; }

Shape 類有兩個構造函數。第一個是默認構造函數。第二個有兩個參數:x,y 坐標。

public Circle(int r, int x, int y) : base(x, y) {this.r = r; }

????????這是 Circle 類的構造函數。此構造函數初始化 r 成員并調用父級的第二個構造函數,并將 x、y 坐標傳遞給該構造函數。如果我們沒有使用 base 關鍵字顯式調用構造函數,則會調用 Shape 類的默認構造函數。

$ dotnet run Circle, r:2, x:5, y:6

十四、C#抽象類和方法

抽象類不能被實例化。如果一個類至少包含一個抽象方法,它也必須聲明為抽象的。抽象方法無法實現;他們只是聲明方法的簽名。當我們從抽象類繼承時,所有抽象方法都必須由派生類實現。此外,這些方法必須聲明為具有較少限制的可見性。

與接口不同,抽象類可能具有完全實現的方法,也可能具有定義的成員字段。所以抽象類可以提供部分實現。程序員經常將一些通用功能放入抽象類中。這些抽象類后來被子類化以提供更具體的實現。

例如,Qt 圖形庫有一個 QAbstractButton,它是按鈕小部件的抽象基類,提供按鈕共有的功能。按鈕 Q3Button、QCheckBox、QPushButton、QRadioButton 和 QToolButton 繼承自此基本抽象類。

正式地說,抽象類用于執行協議。協議是所有實現對象必須支持的一組操作。

Program.cs

namespace AbstractClass;abstract class Drawing {protected int x = 0;protected int y = 0;public abstract double Area();public string GetCoordinates(){return string.Format("x: {0}, y: {1}", this.x, this.y);} }class Circle : Drawing {private int r;public Circle(int x, int y, int r){this.x = x;this.y = y;this.r = r;}public override double Area(){return this.r * this.r * Math.PI;}public override string ToString(){return string.Format("Circle at x: {0}, y: {1}, radius: {2}",this.x, this.y, this.r);} }class Program {static void Main(string[] args){var c = new Circle(12, 45, 22);Console.WriteLine(c);Console.WriteLine("Area of circle: {0}", c.Area());Console.WriteLine(c.GetCoordinates());} }

????????我們有一個抽象的基礎繪圖類。該類定義了兩個成員字段,定義了一種方法并聲明了一種方法。其中一種方法是抽象的,另一種是完全實現的。繪圖類是抽象的,因為我們無法繪制它。我們可以畫一個圓、一個點或一個正方形。繪圖類對我們可以繪制的對象有一些共同的功能。

namespace AbstractClass;

命名空間用于組織代碼。文件中定義的類屬于 AbstractClass 命名空間。

abstract class Drawing

我們使用 abstract 關鍵字來定義一個抽象類。

public abstract double Area();

抽象方法前面也有抽象關鍵字。

class Circle : Drawing

圓是繪圖類的子類。它必須實現抽象區域方法。

public override double Area() {return this.r * this.r * Math.PI; }

????????當我們實現區域方法時,我們必須使用覆蓋關鍵字。這樣我們通知編譯器我們覆蓋了一個現有的(繼承的)方法。

$ dotnet run Circle at x: 12, y: 45, radius: 22 Area of circle: 1520.53084433746 x: 12, y: 45

十五、C#部分類

????????使用部分關鍵字,可以將類的定義拆分為同一命名空間內的多個部分。該類也可以在多個文件中定義。

????????在處理非常大的代碼庫時使用部分類,可以將其拆分為更小的單元。部分類也與自動代碼生成器一起使用。

Program.cs

namespace PartialClass;partial class Worker {public string DoWork(){return "Doing work";} }partial class Worker {public string DoPause(){return "Pausing";} }class Program {static void Main(string[] args){var worker = new Worker();Console.WriteLine(worker.DoWork());Console.WriteLine(worker.DoWork());Console.WriteLine(worker.DoPause());} }

在示例中,我們將 Worker 類定義為兩部分。編譯器將這些部分連接在一起以形成最終類。

$ dotnet run Doing work Doing work Pausing

總結

以上是生活随笔為你收集整理的C#教程8:面向对象编程【02】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。