C# 面向對象實例演示

C# 面向對象編程實例演示

一、基礎概念回顧

面向對象編程(OOP)的四大基本特性:

  1. ??封裝?? - 將數據和操作數據的方法綁定在一起
  2. ??繼承?? - 創建新類時重用現有類的屬性和方法
  3. ??多態?? - 同一操作作用于不同對象產生不同結果
  4. ??抽象?? - 簡化復雜系統,只暴露必要接口

二、完整實例演示

示例1:銀行賬戶系統

using System;// 抽象基類 - 封裝共同屬性和行為
public abstract class BankAccount
{// 封裝字段private string _accountNumber;private decimal _balance;// 屬性 - 控制對字段的訪問public string AccountNumber { get => _accountNumber; private set => _accountNumber = value; }public decimal Balance { get => _balance; protected set => _balance = value; }// 構造函數protected BankAccount(string accountNumber, decimal initialBalance){AccountNumber = accountNumber;Balance = initialBalance;}// 抽象方法 - 由子類實現public abstract void Deposit(decimal amount);public abstract void Withdraw(decimal amount);// 虛方法 - 可被子類重寫public virtual void DisplayAccountInfo(){Console.WriteLine($"賬戶號: {AccountNumber}");Console.WriteLine($"余額: {Balance:C}");}
}// 派生類 - 繼承并擴展功能
public class SavingsAccount : BankAccount
{private const decimal MinimumBalance = 100;private const decimal InterestRate = 0.02m;public SavingsAccount(string accountNumber, decimal initialBalance) : base(accountNumber, initialBalance){if (initialBalance < MinimumBalance)throw new ArgumentException("儲蓄賬戶最低余額為100元");}// 實現抽象方法public override void Deposit(decimal amount){if (amount <= 0)throw new ArgumentException("存款金額必須大于0");Balance += amount;Console.WriteLine($"成功存入 {amount:C},當前余額: {Balance:C}");}public override void Withdraw(decimal amount){if (amount <= 0)throw new ArgumentException("取款金額必須大于0");if (Balance - amount < MinimumBalance)throw new InvalidOperationException("取款后余額不能低于最低限額");Balance -= amount;Console.WriteLine($"成功取出 {amount:C},當前余額: {Balance:C}");}// 新增方法public void ApplyInterest(){decimal interest = Balance * InterestRate;Balance += interest;Console.WriteLine($"利息已應用: {interest:C},新余額: {Balance:C}");}// 重寫虛方法public override void DisplayAccountInfo(){base.DisplayAccountInfo();Console.WriteLine($"賬戶類型: 儲蓄賬戶");Console.WriteLine($"最低余額要求: {MinimumBalance:C}");}
}// 另一個派生類
public class CheckingAccount : BankAccount
{private const decimal OverdraftLimit = -500;public CheckingAccount(string accountNumber, decimal initialBalance) : base(accountNumber, initialBalance){}public override void Deposit(decimal amount){if (amount <= 0)throw new ArgumentException("存款金額必須大于0");Balance += amount;Console.WriteLine($"支票賬戶存入 {amount:C},當前余額: {Balance:C}");}public override void Withdraw(decimal amount){if (amount <= 0)throw new ArgumentException("取款金額必須大于0");if (Balance - amount < OverdraftLimit)throw new InvalidOperationException($"取款后余額不能低于透支限額 {OverdraftLimit:C}");Balance -= amount;Console.WriteLine($"支票賬戶取出 {amount:C},當前余額: {Balance:C}");}public void WriteCheck(decimal amount){try{Withdraw(amount);Console.WriteLine($"已開具 {amount:C} 支票");}catch (Exception ex){Console.WriteLine($"開具支票失敗: {ex.Message}");}}
}// 演示類
public class BankDemo
{public static void Main(){// 多態 - 使用基類引用指向派生類對象BankAccount savings = new SavingsAccount("SAV12345", 1000);BankAccount checking = new CheckingAccount("CHK67890", 500);// 調用方法savings.Deposit(200);savings.Withdraw(50);savings.DisplayAccountInfo();Console.WriteLine("\n-----------------\n");checking.Deposit(300);checking.WriteCheck(100);checking.Withdraw(700); // 嘗試透支checking.DisplayAccountInfo();// 使用is和as運算符if (savings is SavingsAccount savingsAcc){savingsAcc.ApplyInterest();}BankAccount? unknownAccount = null;var tempAccount = unknownAccount as SavingsAccount;if (tempAccount == null){Console.WriteLine("賬戶類型轉換失敗");}}
}

示例2:圖形計算系統

using System;
using System.Collections.Generic;// 接口定義
public interface IShape
{decimal CalculateArea();decimal CalculatePerimeter();void Draw();
}// 具體實現類
public class Circle : IShape
{private decimal _radius;public Circle(decimal radius){if (radius <= 0)throw new ArgumentException("半徑必須大于0");_radius = radius;}public decimal Radius => _radius;public decimal CalculateArea() => (decimal)Math.PI * _radius * _radius;public decimal CalculatePerimeter() => 2 * (decimal)Math.PI * _radius;public void Draw(){Console.WriteLine($"繪制圓形,半徑: {_radius}");// 實際繪圖代碼...}
}public class Rectangle : IShape
{private decimal _width;private decimal _height;public Rectangle(decimal width, decimal height){if (width <= 0 || height <= 0)throw new ArgumentException("寬度和高度必須大于0");_width = width;_height = height;}public decimal Width => _width;public decimal Height => _height;public decimal CalculateArea() => _width * _height;public decimal CalculatePerimeter() => 2 * (_width + _height);public void Draw(){Console.WriteLine($"繪制矩形,寬度: {_width},高度: {_height}");// 實際繪圖代碼...}
}// 工廠類 - 封裝對象創建邏輯
public static class ShapeFactory
{public static IShape CreateShape(string shapeType, params decimal[] parameters){return shapeType.ToLower() switch{"circle" => new Circle(parameters[0]),"rectangle" => new Rectangle(parameters[0], parameters[1]),_ => throw new ArgumentException("未知的形狀類型")};}
}// 圖形管理器 - 組合多個圖形
public class ShapeManager
{private readonly List<IShape> _shapes = new();public void AddShape(IShape shape){_shapes.Add(shape);}public decimal TotalArea() => _shapes.Sum(s => s.CalculateArea());public decimal TotalPerimeter() => _shapes.Sum(s => s.CalculatePerimeter());public void DrawAllShapes(){foreach (var shape in _shapes){shape.Draw();}}
}// 演示類
public class ShapeDemo
{public static void Main(){// 多態使用IShape circle = new Circle(5);IShape rectangle = new Rectangle(4, 6);Console.WriteLine($"圓形面積: {circle.CalculateArea()}");Console.WriteLine($"矩形周長: {rectangle.CalculatePerimeter()}");// 工廠模式使用IShape anotherCircle = ShapeFactory.CreateShape("circle", 3);IShape anotherRectangle = ShapeFactory.CreateShape("rectangle", 2, 5);// 組合模式使用var manager = new ShapeManager();manager.AddShape(circle);manager.AddShape(rectangle);manager.AddShape(anotherCircle);manager.AddShape(anotherRectangle);Console.WriteLine($"\n所有圖形總面積: {manager.TotalArea()}");Console.WriteLine($"所有圖形總周長: {manager.TotalPerimeter()}");Console.WriteLine("\n繪制所有圖形:");manager.DrawAllShapes();// 接口實現檢查if (circle is Circle c){Console.WriteLine($"這是一個圓形,半徑: {c.Radius}");}// 使用as運算符var maybeCircle = rectangle as Circle;if (maybeCircle == null){Console.WriteLine("這不是一個圓形");}}
}

示例3:動物模擬系統

using System;// 基類
public abstract class Animal
{// 字段封裝private string _name;private int _age;// 屬性public string Name { get => _name; set => _name = value ?? throw new ArgumentNullException(nameof(value)); }public int Age { get => _age; protected set => _age = value >= 0 ? value : throw new ArgumentOutOfRangeException(nameof(value)); }// 構造函數protected Animal(string name, int age){Name = name;Age = age;}// 抽象方法 - 必須由子類實現public abstract void MakeSound();// 虛方法 - 可被子類重寫public virtual void Eat(){Console.WriteLine($"{Name}正在吃東西");}// 密封方法 - 阻止進一步重寫public sealed override string ToString(){return $"{GetType().Name}: {Name}, {Age}歲";}
}// 派生類
public class Dog : Animal
{public Dog(string name, int age) : base(name, age){}public override void MakeSound(){Console.WriteLine($"{Name}汪汪叫!");}// 新增方法public void Fetch(){Console.WriteLine($"{Name}正在撿球");}
}public class Cat : Animal
{public Cat(string name, int age) : base(name, age){}public override void MakeSound(){Console.WriteLine($"{Name}喵喵叫!");}// 重寫基類方法public override void Eat(){Console.WriteLine($"{Name}正在優雅地吃貓糧");}// 隱藏基類方法(不推薦)public new void ToString(){Console.WriteLine("這不會覆蓋基類的ToString");}
}// 接口
public interface ITrainable
{void Train(string command);
}// 實現接口的類
public class PoliceDog : Dog, ITrainable
{public PoliceDog(string name, int age) : base(name, age){}public void Train(string command){Console.WriteLine($"{Name}正在接受'{command}'訓練");}
}// 演示類
public class AnimalDemo
{public static void Main(){// 多態使用Animal[] animals = new Animal[]{new Dog("旺財", 3),new Cat("咪咪", 2),new PoliceDog("阿黃", 5)};foreach (var animal in animals){animal.MakeSound();animal.Eat();// 類型檢查與轉換if (animal is Dog dog){dog.Fetch();}if (animal is ITrainable trainable){trainable.Train("坐下");}Console.WriteLine(animal.ToString());Console.WriteLine();}// 接口實現檢查if (animals[2] is PoliceDog policeDog){policeDog.Train("臥倒");}// as運算符var maybeTrainable = animals[1] as ITrainable;if (maybeTrainable == null){Console.WriteLine("貓不能接受訓練");}}
}

三、關鍵概念詳解

1. 封裝

??優點??:

  • 隱藏實現細節
  • 提供公共接口
  • 控制對數據的訪問

??示例??:

public class Person
{// 私有字段private string _ssn;// 公共屬性 - 控制訪問public string SSN{get => _ssn;set{if (string.IsNullOrEmpty(value))throw new ArgumentException("SSN不能為空");if (value.Length != 9)throw new ArgumentException("SSN必須是9位");_ssn = value;}}// 只讀屬性public int Age { get; private set; }// 構造函數初始化public Person(string ssn, int age){SSN = ssn;Age = age;}// 方法封裝行為public void HaveBirthday(){Age++;Console.WriteLine($"生日快樂!現在是{Age}歲");}
}

2. 繼承

??語法??:

public class BaseClass
{// 基類成員
}public class DerivedClass : BaseClass
{// 派生類成員
}

??示例??:

public class Vehicle
{public string Make { get; set; }public string Model { get; set; }public virtual void Start(){Console.WriteLine("車輛啟動");}
}public class Car : Vehicle
{public int DoorCount { get; set; }public override void Start(){Console.WriteLine("汽車啟動");base.Start(); // 調用基類方法}public void Honk(){Console.WriteLine("喇叭響");}
}

3. 多態

??實現方式??:

  1. 方法重寫(override)
  2. 接口實現
  3. 抽象方法

??示例??:

public interface IShape
{decimal Area();
}public class Circle : IShape
{public decimal Radius { get; set; }public decimal Area() => (decimal)Math.PI * Radius * Radius;
}public class Rectangle : IShape
{public decimal Width { get; set; }public decimal Height { get; set; }public decimal Area() => Width * Height;
}// 使用
IShape[] shapes = new IShape[]
{new Circle { Radius = 5 },new Rectangle { Width = 4, Height = 6 }
};foreach (var shape in shapes)
{Console.WriteLine($"面積: {shape.Area()}");
}

4. 抽象

??抽象類??:

public abstract class Animal
{public abstract void MakeSound(); // 必須由子類實現public virtual void Eat() // 可選實現{Console.WriteLine("動物在吃東西");}
}

??接口??:

public interface IDriveable
{void Drive();int MaxSpeed { get; set; }
}

??示例??:

public abstract class Shape
{public abstract decimal CalculateArea();public virtual void Display(){Console.WriteLine("這是一個形狀");}
}public class Triangle : Shape
{public decimal Base { get; set; }public decimal Height { get; set; }public override decimal CalculateArea(){return Base * Height / 2;}public new void Display() // 隱藏基類方法(不推薦){Console.WriteLine("這是一個三角形");}
}

四、設計模式示例

1. 工廠模式

public interface IWeapon
{void Attack();
}public class Sword : IWeapon
{public void Attack() => Console.WriteLine("揮劍攻擊");
}public class Bow : IWeapon
{public void Attack() => Console.WriteLine("拉弓射箭");
}public static class WeaponFactory
{public static IWeapon CreateWeapon(string weaponType){return weaponType.ToLower() switch{"sword" => new Sword(),"bow" => new Bow(),_ => throw new ArgumentException("未知武器類型")};}
}// 使用
IWeapon weapon = WeaponFactory.CreateWeapon("sword");
weapon.Attack();

2. 單例模式

public sealed class Logger
{private static readonly Lazy<Logger> _instance = new Lazy<Logger>(() => new Logger());public static Logger Instance => _instance.Value;private Logger() { }public void Log(string message){Console.WriteLine($"[{DateTime.Now}] {message}");}
}// 使用
Logger.Instance.Log("系統啟動");

3. 觀察者模式

public interface IObserver
{void Update(string message);
}public class NewsAgency
{private readonly List<IObserver> _observers = new();public void AddObserver(IObserver observer){_observers.Add(observer);}public void RemoveObserver(IObserver observer){_observers.Remove(observer);}public void PublishNews(string news){foreach (var observer in _observers){observer.Update(news);}}
}public class Subscriber : IObserver
{public string Name { get; }public Subscriber(string name){Name = name;}public void Update(string message){Console.WriteLine($"{Name}收到新聞: {message}");}
}// 使用
var agency = new NewsAgency();
agency.AddObserver(new Subscriber("張三"));
agency.AddObserver(new Subscriber("李四"));agency.PublishNews("股市今日大漲");

五、最佳實踐

  1. ??優先使用組合而非繼承??:

    // 更好的設計 - 使用組合
    public class Engine { }public class Car
    {public Engine Engine { get; } = new Engine();
    }
  2. ??遵循SOLID原則??:

    • 單一職責原則(SRP)
    • 開閉原則(OCP)
    • 里氏替換原則(LSP)
    • 接口隔離原則(ISP)
    • 依賴倒置原則(DIP)
  3. ??合理使用訪問修飾符??:

    public class MyClass
    {public int PublicField; // 慎用protected int ProtectedField;internal int InternalField;protected internal int ProtectedInternalField;private int _privateField; // 推薦
    }
  4. ??避免過度使用繼承??:

    • 繼承層次不要太深(通常不超過3層)
    • 考慮使用接口或組合替代
  5. ??使用屬性而非公共字段??:

    // 不推薦
    public class BadDesign
    {public int Value;
    }// 推薦
    public class GoodDesign
    {private int _value;public int Value{get => _value;set => _value = value > 0 ? value : throw new ArgumentOutOfRangeException();}
    }
  6. ??實現IDisposable接口管理資源??:

    public class ResourceHolder : IDisposable
    {private bool _disposed = false;private FileStream _fileStream;public ResourceHolder(string path){_fileStream = new FileStream(path, FileMode.Open);}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}protected virtual void Dispose(bool disposing){if (!_disposed){if (disposing){_fileStream?.Dispose();}_disposed = true;}}~ResourceHolder() => Dispose(false);
    }

通過以上實例和最佳實踐,您可以更好地理解和應用C#的面向對象編程特性,編寫出更健壯、可維護和可擴展的代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77940.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77940.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77940.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大連理工大學選修課——機器學習筆記(3):KNN原理及應用

KNN原理及應用 機器學習方法的分類 基于概率統計的方法 K-近鄰&#xff08;KNN&#xff09;貝葉斯模型最小均值距離最大熵模型條件隨機場&#xff08;CRF&#xff09;隱馬爾可夫模型&#xff08;HMM&#xff09; 基于判別式的方法 決策樹&#xff08;DT&#xff09;感知機…

蔣新松:中國機器人之父

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 蔣新松:中國機器人之父 一、生平簡介 1. 早年經歷與求學道路 蔣新松出生于1931年8月3日,江蘇省江陰澄北鎮一個靠近長江的小鎮。他的名字來源于杜…

表征(Representations)、嵌入(Embeddings)及潛空間(Latent space)

文章目錄 1. 表征 (Representations)2. 嵌入 (Embeddings)3. 潛空間 (Latent Space)4. 關系總結5. 學習思考 1. 表征 (Representations) 定義: 表征是指數據的一種編碼或描述形式。在機器學習和深度學習中&#xff0c;它特指模型在處理數據時&#xff0c;將原始輸入數據轉換成…

【STM32實物】基于STM32的RFID多卡識別語音播報系統設計

演示視頻: 基于STM32的RFID多卡識別語音播報系統設計 前言:本項目可實現多個電子標簽IC卡RFID識別,刷卡識別后進行中文語音播報反饋,同時進行控制對應的燈光開關。以此也可擴展開發更多功能。 本項目所需主要硬件包括:STM32F103C8T6最小系統板、RFID-RC522模塊、五個IC電…

全面了解CSS語法 ! ! !

CSS&#xff08;層疊樣式表&#xff09;是網頁設計的靈魂之一&#xff0c;它賦予了網頁活力與美感。無論是為一個簡單的個人博客增添色彩&#xff0c;還是為復雜的企業網站設計布局&#xff0c;CSS都是不可或缺的工具。那么&#xff0c;CSS語法到底是什么樣的呢&#xff1f;它背…

青少年抑郁癥患者亞群結構和功能連接耦合的重構

目錄 1 研究背景及目的 2 研究方法 2.1 數據來源與參與者 2.1.1 MDD患者&#xff1a; 2.1.2 健康對照組&#xff1a; 2.2 神經影像分析流程 2.2.1 圖像采集與預處理&#xff1a; 2.2.2 網絡構建&#xff1a; 2.2.3 區域結構-功能耦合&#xff08;SC-FC耦合&#xff09…

【QT】編寫第一個 QT 程序 對象樹 Qt 編程事項 內存泄露問題

目錄 1. 編寫第一個 QT 程序 1.1 使用 標簽 實現 1.2 純代碼形式實現 1.3 使用 按鈕 實現 1.3.1 圖形化界面實現 1.3.2 純代碼形式實現 1.4 使用 編輯框 實現 1.4.1 圖形化界面實現 1.4.2 純代碼形式實現 1.4.3 內存泄露 2. 認識對象模型&#xff08;對象樹&…

在pycharm中創建Django項目并啟動

Django介紹 Django 是一個基于 Python 的開源 Web 應用框架&#xff0c;采用了 MTV&#xff08;Model - Template - View&#xff09;軟件設計模式 &#xff0c;由許多功能強大的組件組成&#xff0c;能夠幫助開發者快速、高效地創建復雜的數據庫驅動的 Web 應用程序。它具有以…

在Carla中構建自動駕駛:使用PID控制和ROS2進行路徑跟蹤

機器人軟件開發什么是 P、PI 和 PID 控制器&#xff1f;比例 &#xff08;P&#xff09; 控制器比例積分 &#xff08;PI&#xff09; 控制器比例-積分-微分 &#xff08;PID&#xff09; 控制器橫向控制簡介CARLA ROS2 集成縱向控制橫向控制關鍵要點結論引用 機器人軟件開發 …

【KWDB 創作者計劃】_深度解析KWDB存儲引擎

文章目錄 每日一句正能量引言一、存儲引擎核心模塊結構二、寫前日志 WAL&#xff08;Write-Ahead Log&#xff09;三、列式壓縮存儲&#xff08;Columnar Compression&#xff09;四、索引機制與混合查詢調度五、分布式核心功能&#xff1a;租約管理實戰六、時間序列數據處理&a…

Apache Tomcat 漏洞(CVE-2025-24813)導致服務器面臨 RCE 風險

CVE-2025-24813Apache Tomcat 中發現了一個嚴重安全漏洞,標識為,該漏洞可能導致服務器面臨遠程代碼執行 (RCE)、信息泄露和數據損壞的風險。 此缺陷影響以下版本: Apache Tomcat11.0.0-M1通過11.0.2Apache Tomcat10.1.0-M1通過10.1.34Apache Tomcat9.0.0-M1通過9.0.98了解 …

全面解析SimHash算法:原理、對比與Spring Boot實踐指南

一、SimHash算法概述 SimHash是一種局部敏感哈希算法&#xff0c;由Google工程師Moses Charikar提出&#xff0c;主要用于海量文本的快速去重與相似度檢測。其核心思想是將高維特征向量映射為固定長度的二進制指紋&#xff08;如64位&#xff09;&#xff0c;通過計算指紋間的…

臨床回歸分析及AI推理

在醫療保健決策越來越受數據驅動的時代&#xff0c;回歸分析已成為臨床醫生和研究人員最強大的工具之一。無論是預測結果、調整混雜因素、建模生存時間還是理解診斷性能&#xff0c;回歸模型都為將原始數據轉化為臨床洞察提供了統計學基礎。 AI推理 然而&#xff0c;隨著技術…

西門子PLC S7-1200 電動機的軟啟動控制

1 PWM 控制的基本概念 PWM 是 PulseWidth Modulation 的簡稱。 PWM 控制是一種脈沖寬度調制技術,通過對一系列脈沖的寬度進行調制來等效獲得所需要的波形(含形狀和幅值)。PWM 控制技術在逆變電路中應用比較廣泛,所應用的逆變電路絕大部分是PWM 型。除此之外, PWM 控制技術…

【學習 python day5】

學習目標&#xff1a; python基礎 掌握函數的定義及調用方法掌握模塊的用法掌握包的用法掌握如何捕獲異常 web自動化測試 能完成selenium自動化環境部署及結果驗證掌握selenium實現自動化測試的核心步驟 學習內容&#xff1a; 一、Python基礎 1、集合[了解] 1, 集合 set, …

day006-實戰練習題-參考答案

老男孩教育-99期-實戰練習題 1. 你作為"老男孩教育99期云計算"新晉運維工程師&#xff0c;在入職首日遭遇緊急事件&#xff1a; "生產環境3臺Web服務器突發性能告警&#xff0c;技術總監要求你立即完成&#xff1a; 快速建立故障診斷工作區收集關鍵系統指標分…

C# 實現列式存儲數據

C#實現列式存儲數據指南 一、列式存儲概述 列式存儲(Columnar Storage)是一種數據存儲方式&#xff0c;它將數據按列而非行組織。與傳統的行式存儲相比&#xff0c;列式存儲在以下場景具有優勢&#xff1a; ??分析型查詢??&#xff1a;聚合計算、分組統計等操作效率更高…

Mysql索引分類、索引失效場景

索引分類 按數據結構分類? B-Tree索引&#xff08;BTree&#xff09; 描述??&#xff1a;默認的索引類型&#xff0c;大多數存儲引擎&#xff08;如InnoDB、MyISAM&#xff09;支持。實際使用BTree結構&#xff0c;數據存儲在葉子節點&#xff0c;葉子節點通過指針連接&a…

SpringBoot+Redis全局唯一ID生成器

&#x1f4e6; 優雅版 Redis ID 生成器工具類 支持&#xff1a; 項目啟動時自動初始化起始值獲取自增 ID 方法yml 配置化起始值可靈活擴展多業務線 ID &#x1f4cc; application.yml 配置 id-generator:member-start-value: 1000000000&#x1f4cc; 配置類&#xff1a;IdG…

深入掌握CSS背景圖片:從基礎到實戰

背景圖片&#xff1a; 本文將通過系統化的講解實戰案例&#xff0c;幫助讀者徹底掌握CSS背景圖片的六大核心知識點。每個知識點都包含對比演示和記憶技巧&#xff0c;建議結合代碼實操學習。 一、背景圖片基礎設置 使用background-image&#xff08;路徑&#xff09;屬性設置…