序號 | 系列文章 |
---|---|
5 | 【C#基礎】C# 運算符總結 |
6 | 【C#基礎】C# 常用語句講解 |
7 | 【C#基礎】C# 常用數(shù)據(jù)結構 |
前言
??大家好,我是writer桑,前面一章已經(jīng)學習了 C# 中的常用數(shù)據(jù)結構,那本章就開始學習 C# 程序中面向?qū)ο缶幊痰闹R,希望看完大家能夠有所收獲,感謝支持!
面向?qū)ο蟮?C#
面向?qū)ο缶幊?/strong>是一種計算機編程架構(Object Oriented Programming,簡稱OOP)。OOP把對象作為程序的基本單元,一個對象包含了數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)。OOP的三大特征分別為封裝、繼承和多態(tài)。用公式概括為:OOP=對象+類+繼承+多態(tài)+消息,其中核心概念是類和對象。 C# 就是一種面向?qū)ο蟮木幊陶Z言,完美實現(xiàn)了抽象、封裝、繼承和多態(tài)性的面向?qū)ο筇匦浴?/p>
1,類的概念
類的創(chuàng)建就相當于生成了一個藍圖。在藍圖中指定該類可以進行哪些操作,也就是在類中創(chuàng)建指定字段、屬性和方法成員。對象是類的實例,類對象的組成和操作都是由類決定的。 在 C# 程序中使用"訪問修飾符"(可選)+ class 關鍵字 + "類的名稱"來聲明類。
示例如下:
public class Person // 類名稱的聲明
{
public string Name { get; set; } // 成員屬性
public int Age { get; set; }
// 成員函數(shù)
public Person(string name, int age)
{
Name = name;
Age = age;
}
// 成員方法
public void MethodBody()
{
Console.WriteLine("Hello,World");
}
// 其他屬性、方法、事件……
}
2,類的定義
C# 定義類使用唯一的標識符 class 。 類定義的語法可概括為 <access specifier> class class_name , 其中 <access specifier> 為訪問修飾符,class_name 為類的名稱,類名稱必須符合 C# 的命名規(guī)范。
訪問修飾符的概念和使用:
class 關鍵字前面前面是訪問修飾符,示例中使用的是 public 修飾符 ,也可以是 public、private、protected、internal、protected internal 和 private protected,默認為 internal 。 這些訪問修飾符分別表達的意思以一個表格來展示。
表格如下:
訪問修飾符 | 描述 |
---|---|
public | 同一程序集中的任何其他代碼或引用該程序集的其他程序集都可以訪問該類型或成員。 某一類型的公共成員的可訪問性水平由該類型本身的可訪問性級別控制。 |
private | 只有同一 class 或 struct 中的代碼可以訪問該類型或成員。 |
protected | 只有同一 class 或者從該 class 派生的 class 中的代碼可以訪問該類型或成員。 |
internal | 同一程序集中的任何代碼都可以訪問該類型或成員,但其他程序集中的代碼不可以。 換句話說,internal 類型或成員可以從屬于同一編譯的代碼中訪問。 |
protected internal | 該類型或成員可由對其進行聲明的程序集或另一程序集中的派生 class 中的任何代碼訪問。 |
private protected | 該類型或成員可以通過從 class 派生的類型訪問,這些類型在其包含程序集中進行聲明。 |
抽象類的概念和使用:
使用 abstract 關鍵字可以創(chuàng)建不完整且必須在派生類中實現(xiàn)的類和 class 成員,稱為抽象方法。 C# 規(guī)定抽象方法的實現(xiàn)必須放在抽象類中。抽象類不能實例化,抽象類的用途就是提供一個可供多個派生類共享的通用基類定義。通過在類定義前面放置 abstract 修飾符將其聲明為抽象類。
示例如下:
using System;
public abstract class AbstProgram // 必須聲明為抽象類
{
public abstract string abstMethod(); // 抽象方法
}
public class Subclass : AbstProgram
{
// 抽象方法必須實現(xiàn)
public override string abstMethod()
{
return "hello,abstMethod";
}
}
密封類的概念和使用:
使用 sealed 修飾符應用于某個類時,這個類稱為密封類。密封類可以阻止其他類繼承自該類,還可以對替代基類中的虛方法或?qū)傩缘姆椒ɑ驅(qū)傩允褂?sealed 修飾符。這使得類派生自你的類并防止它們替代特定虛方法或?qū)傩浴?/p>
示例如下:
using System;
public class Program
{
public virtual void virmethod() // 虛方法
{
Console.WriteLine("hello,virmethod");
}
}
public sealed class SealClass : Program // 密封類
{
public override sealed void virmethod()
{
Console.WriteLine("hello, sealed");
}
}
靜態(tài)類的概念和使用:
類的聲明可以添加 static 修飾符聲明為靜態(tài)類。 靜態(tài)類只能包含靜態(tài)成員,不能使用 new 關鍵字字進行實例化。 靜態(tài)類基本上與非靜態(tài)類相同,但有一個區(qū)別就是靜態(tài)類無法被實例化。由于不存在任何實例變量,因此可以使用類名本身訪問靜態(tài)類的成員。
示例如下:
using System;
// 靜態(tài)類
static class StaticMethod
{
public static int number = 4;
public static int getNumber()
{
return number;
}
};
public class Program
{
static void Main(string[] args)
{
Console.WriteLine(StaticMethod.getNumber());
}
}
3,類成員
類的成員包括在類中聲明的所有成員, 以及在該類中的繼承層次結構中的所有類中聲明的所有成員(構造函數(shù)和析構函數(shù)除外)。 注意基類中的私有成員被繼承,但是不能從派生類中訪問。 在類中定義的字段、屬性、方法和事件都可以稱為類成員。
字段和屬性的概念與使用:
字段也就是在類范圍聲明的變量,字段可以是內(nèi)置數(shù)值類型或其他類的實例。 屬性是類中可以像類中的字段一樣訪問的方法。屬性可以為類字段提供保護,以避免字段在對象不知道的情況下被更改。
示例如下:
using System;
public class Person
{
public int age; // 字段的聲明
// 屬性的聲明
public int Age
{
set
{
if(value > 0 && value < 100)
{
age = value;
}
}
get
{
return age;
}
}
}
字段和屬性的區(qū)別:
- 屬性相當于在類中的變量,而字段具備 set 和 get 的操作。
- 讀取字段的值時,程序走的是 get{} 操作;給字段賦值時,程序走的是 get{} 操作。
- 當想讓字段不被賦值時,可以只寫get{} 操作,不寫 set{} 操作。
構造函數(shù)和析構函數(shù)的概念與使用:
構造函數(shù)是一個特殊的成員函數(shù),是在首次創(chuàng)建類對象時執(zhí)行的方法,它們通常用于初始化對象的數(shù)據(jù)。構造函數(shù)的名稱和類的名稱完全相同,且沒有任何返回類型。 折構函數(shù)也是類的一個特殊的成員函數(shù), 是在類的對象超出范圍時執(zhí)行,通常用于結束程序(比如關閉文件、釋放內(nèi)存等)之前釋放資源。折構函數(shù)在類名稱前面加一個 ~ 前綴進行聲明,而且不具備任何返回值和參數(shù)。
示例如下:
using System;
public class Person
{
private string last;
private string first;
// 構造函數(shù)的聲明并且初始化類字段
public Person(string lastName, string firstName)
{
last = lastName;
first = firstName;
}
}
using System;
class Person
{
private int age;
// 構造函數(shù)
public Person()
{
Console.WriteLine("對象已創(chuàng)建");
}
//析構函數(shù)
~Person()
{
Console.WriteLine("對象已刪除");
}
}
類方法的概念和使用:
方法是包含一系列語句的代碼塊,類方法定義類可以執(zhí)行的操作。程序通過調(diào)用該方法并指定任何所需的方法參數(shù)使語句得以執(zhí)行。方法可接收提供輸入數(shù)據(jù)的參數(shù),并可通過參數(shù)返回輸出數(shù)據(jù)。方法也可以不使用參數(shù)而直接返回值。 使用 “訪問修飾符” + “返回數(shù)據(jù)類型” + “方法名稱” 的格式來聲明類方法。
示例如下:
public class Person
{
// 成員方法
public void MethodBody()
{
Console.WriteLine("Hello,World"); // "Hello,World"
}
}
虛方法的概念和使用:
虛方法也就是可以被派生類重寫的方法,如果派生類重寫基類中的虛方法,則在運行時將運行重寫的行為。但是如果派生類沒有重寫虛方法,則運行時執(zhí)行基類中的虛方法行為。 在 C## 程序中,使用 virtual 關鍵字來聲明虛方法。
示例如下:
public class Rectangular
{
// 虛方法
public virtual double Area(int x, int y)
{
return x * y;
}
}
public class Program : Rectangular
{
// 重寫虛方法
public override double Area(int x, int y)
{
return x * y;
}
}
抽象方法的概念和使用:
抽象方法也是可以被派生類重寫的方法,但是和虛方法不同的是抽象方法是強制派生類重寫的方法, 否則派生類就不能實例化。 抽象方法只能在抽象類中聲明,可以使用 abstract 修飾符進行聲明。 抽象方法只有方法名稱, 沒有方法實現(xiàn)。
示例如下:
public abstract class Animal
{
// 抽象方法的聲明
public abstract void Sleep();
public abstract void Eat();
}
public class Person : Animal
{
// 必須實現(xiàn)基類中的抽象方法
public override void Eat()
{
throw new NotImplementedException();
}
public override void Sleep()
{
throw new NotImplementedException();
}
}
點擊了解虛方法和抽象方法的異同,整理第一條。
4,對象
對于面向?qū)ο蟮木幊陶Z言,一切皆為對象,對象是程序的基本單元。對象把程序與數(shù)據(jù)封裝起來提供對外訪問的能力,提高軟件的重用性,靈活性和擴展性。前面說過類或結構定義的作用類似于藍圖 ,指定著該類或結構可以進行哪些操作。 而類的對象是此藍圖分配和配置的內(nèi)存塊。
創(chuàng)建類對象的操作:
C# 程序允許同一個類實例化出多個對象。 可以通過這些對象來操作類中的方法、字段與屬性等類成員??梢允褂?new 運算符創(chuàng)建類對象,同時指定對象的名稱和類型參數(shù)。
示例如下:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
class Program
{
static void Main()
{
// 創(chuàng)建對象 person1
Person person1 = new Person("Leopold", 6);
Console.WriteLine($"person1 Name = {person1.Name} Age = {person1.Age}");
}
}
/*
輸出:
person1 Name = Leopold Age = 6
*/
對象的標識與值相等性:
當比較兩個對象是否相等時,首先必須明確是想知道兩個對象是否是同一個引用,還是這兩個對象一個或多個字段的值是否相等。如果是前者,可使用靜態(tài) Object.Equals 方法。 如果是后者,可以使用 Equals 方法或 == 運算符。
示例如下:
Person p1 = new Person("Wallace", 75);
Person p2 = p1;
if (p2.Equals(p1))
Console.WriteLine("p2和p1有相同的值。");
if (p1.Name == p2.Name)
Console.WriteLine("p1和p2的Name屬性相等。");
5,繼承
繼承是面向?qū)ο缶幊痰娜筇卣髦?。通過繼承,可以重用、擴展和修改被繼承類的行為。其中被繼承的類稱為"基類",繼承這些基類的類稱為派生類。 雖然派生類只能有一個直接基類,但是繼承之間是可以傳遞的。 比方說 ClassC 派生自 ClassB,并且 ClassB 派生自 ClassA,則 ClassC 將繼承在 ClassB 和 ClassA 中聲明的成員。
繼承的使用:
class 關鍵字前面的是類的名稱。 在示例中類的名稱為 Person 。類(而非結構)支持繼承的概念。派生自另一個類(稱為基類)的類自動包含基類的所有公共、受保護和內(nèi)部成員(其構造函數(shù)和終結器除外)。 在 C# 程序中使用 :標識符來聲明要繼承的父類。
示例如下:
public class Animal
{
public static void animalMethod()
{
Console.WriteLine("這是Animal類的方法");
}
}
public class Person : Animal // 繼承父類 Animal
{
static void Main(string[] args)
{
animalMethod(); // 這是Animal類的方法
}
}
多重繼承的示例:
using System;
// 這是基類 Shape
public class Shape
{
public void setWidth(int w)
{
width = w;
}
public void setHeight(int h)
{
height = h;
}
protected int width;
protected int height;
}
// 這是接口 PaintCost
public interface PaintCost
{
int getCost(int area);
}
// 派生類繼承基類 Shape 和接口 PaintCost
public class Rectangle : Shape, PaintCost
{
public int getArea()
{
return (width * height);
}
// 實現(xiàn)接口中的方法
public int getCost(int area)
{
return area * 70;
}
}
public class RectangleTester
{
static void Main(string[] args)
{
Rectangle Rect = new Rectangle();
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
// 打印對象的面積
Console.WriteLine("總面積: {0}", Rect.getArea());
Console.WriteLine("油漆總成本: ${0}", Rect.getCost(area));
Console.ReadKey();
}
}
接口的概念和使用:
類不僅可以繼承父類,還可以繼承接口。C# 的接口義了所有類或者結構體繼承接口時應實現(xiàn)的一組相關功能的定義。 接口中可以定義屬性、方法和事件,這些都是接口的成員。但是接口不能聲明實例數(shù)據(jù),如字段、自動實現(xiàn)的屬性或類似屬性的事件。接口只包含了成員的聲明,而成員的實現(xiàn)是派生類的任務,一個派生類支持繼承多個接口,接口也可以繼承其它接口。使用 interface 修飾符來聲明一個接口。
示例如下:
interface IMyInterface // 聲明接口 IMyInterface
{
public void intMethod(); // 接口定義的方法
}
public class Person : IMyInterface // Person 類繼承接口 IMyInterface
{
public void intMethod() // 實現(xiàn)接口的方法
{
throw new NotImplementedException();
}
}
點擊了解抽象類和接口的異同,第二條整理。
6,多態(tài)性
多態(tài)性常被視為自封裝和繼承之后,面向?qū)ο缶幊痰牡谌齻€支柱。 多態(tài)性表示當同一操作作用于不同的對象時,可以有不同的行為,返回多種執(zhí)行結果。在實際的應用中,多態(tài)性常表現(xiàn)為“一個接口,多個功能。 C# 的多態(tài)性可以是靜態(tài)的或者動態(tài)的。 在靜態(tài)多態(tài)性中,函數(shù)的響應是在編譯時發(fā)生的。在動態(tài)多態(tài)性中,函數(shù)的響應是在運行時發(fā)生的。
靜態(tài)多態(tài)性:
編譯時的多態(tài)性是通過重載實現(xiàn)的, 對于非虛的成員, 系統(tǒng)在編譯時會根據(jù)傳遞的參數(shù)、返回的類型等信息決定實現(xiàn)何種操作。在編譯期間,函數(shù)和對象的連接機制被稱為早期綁定,也被稱為靜態(tài)綁定。C# 提供了兩種技術來實現(xiàn)靜態(tài)多態(tài)性,分別為函數(shù)重載和運算符重載。 以函數(shù)重載為示例,點擊了解運算符重載。
示例如下:
using System;
public class TestData
{
// 函數(shù)重載
public int Add(int a, int b, int c)
{
return a + b + c;
}
public int Add(int a, int b)
{
return a + b;
}
}
class Program
{
static void Main(string[] args)
{
TestData dataClass = new TestData();
int add1 = dataClass.Add(1, 2);
int add2 = dataClass.Add(1, 2, 3);
Console.WriteLine("add1 :" + add1);
Console.WriteLine("add2 :" + add2);
}
}
動態(tài)多態(tài)性:
除了靜態(tài)多態(tài)性外,還有動態(tài)多態(tài)性。也即只有到系統(tǒng)運行時,程序才根據(jù)實際情況實現(xiàn)具體行為。C# 支持的動態(tài)多態(tài)性可以通過重寫基類中抽象方法和虛方法來實現(xiàn)。
抽象方法的示例:
using System;
abstract class Shape
{
// 聲明抽象方法
abstract public int area();
}
class Rectangle : Shape
{
private int length;
private int width;
// 聲明構造函數(shù)
public Rectangle(int a = 0, int b = 0)
{
length = a;
width = b;
}
// 重寫父類的抽象方法
public override int area()
{
Console.WriteLine("Rectangle 類的面積:");
return (width * length);
}
}
class RectangleTester
{
static void Main(string[] args)
{
Rectangle r = new Rectangle(10, 7);
double a = r.area();
Console.WriteLine("面積: {0}", a);
Console.ReadKey();
}
}
虛方法的示例:文章來源:http://www.zghlxwxcb.cn/news/detail-443416.html
using System;
using System.Collections.Generic;
public class Animal
{
// 虛方法
public virtual void Run()
{
Console.WriteLine("執(zhí)行動物跑的行為");
}
}
class Cat : Animal
{
// 重寫基類Animal中的Run方法
public override void Run()
{
Console.WriteLine("貓在跑");
base.Run();
}
}
class Dog : Animal
{
public override void Run()
{
Console.WriteLine("狗在跑");
base.Run();
}
}
class Pig : Animal
{
public override void Run()
{
Console.WriteLine("豬在跑");
base.Run();
}
}
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建一個 List<Animal> 對象,并向該對象添加 Cat、Pig 和 Dog
var shapes = new List<Animal>
{
new Dog(),
new Pig(),
new Cat()
};
// 使用 foreach 循環(huán)對該列表的派生類進行循環(huán)訪問,并對其中的每個 Animal 對象調(diào)用 Run 方法
foreach (var shape in shapes)
{
shape.Run();
}
Console.WriteLine("按下任意鍵退出。");
Console.ReadKey();
}
}
結語
?? 以上就是 C# 面向?qū)ο缶幊讨R點的介紹,希望能夠?qū)Υ蠹矣兴鶐椭?。望大家多多支持,你們的支持就是筆者創(chuàng)作最大的動力!文章來源地址http://www.zghlxwxcb.cn/news/detail-443416.html
到了這里,關于【C#基礎】C# 面向?qū)ο缶幊痰奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!