当前位置: 首页 > news >正文

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#的面向对象编程特性,编写出更健壮、可维护和可扩展的代码。

相关文章:

C# 面向对象实例演示

C# 面向对象编程实例演示 一、基础概念回顾 面向对象编程(OOP)的四大基本特性&#xff1a; ​​封装​​ - 将数据和操作数据的方法绑定在一起​​继承​​ - 创建新类时重用现有类的属性和方法​​多态​​ - 同一操作作用于不同对象产生不同结果​​抽象​​ - 简化复杂系…...

软件产品测试报告:如何全面评估及保障软件质量?

软件产品测试报告可以对软件产品质量做全面评估&#xff0c;还能够把评估结果展示出来&#xff0c;它依靠一系列测试手段和数据分析&#xff0c;能为产品的完善以及决策提供重要依据。下面从不同方面展开说明。 测试目的 开展本次软件产品测试&#xff0c;主要目的有三个。一…...

leetcode42-接雨水

leetcode 42 思路 本题使用 单调栈 来计算每个位置能够接住的雨水量 理解问题 题目要求计算一系列柱子之间可以接住的雨水量。输入是一个数组&#xff0c;每个元素代表柱子的高度。输出是一个整数&#xff0c;表示能够接住的水量。 找到边界条件 什么情况下可以接住雨水…...

普通IT的股票交易成长史--20250430晚

声明&#xff1a;本文章的内容只是自己学习的总结&#xff0c;不构成投资建议。文中观点基本来自yt站Andylee&#xff0c;美股Alpha姐&#xff0c;综合自己的观点得出。感谢他们的无私分享。 送给自己的话&#xff1a; 仓位就是生命&#xff0c;绝对不能满仓&#xff01;&…...

Elastic Security 8.18 和 9.0 中的新功能

作者&#xff1a;来自 Elastic Mark Settle, Tamarian Del Conte, James Spiteri, Tinsae Erkailo, Charles Davison, Raquel Tabuyo, Kseniia Ignatovych, Paul Ewing, Smriti 检测规则的自动迁移、用于 ES|QL 的 Lookup Join、AI 功能增强&#xff0c;以及更多功能。 Elasti…...

使用 Vue 开发 VS Code 插件前端页面(上)

本文的方案主要参考了这篇博客&#xff1a; Vscode 的 extension webview 开发示例&#xff1a; Vue 和 React 实现 https://juejin.cn/post/7325132202970136585样例项目地址&#xff1a; github | vscode-webview-with-vuehttps://github.com/HiMeditator/vscode-webview-w…...

Vue Router路由原理

Vue Router 是 Vue.js 官方的路由管理器&#xff0c;它与 Vue.js 核心深度集成&#xff0c;使得构建单页应用&#xff08;SPA&#xff09;变得非常容易。Vue Router 的主要功能包括动态路由匹配、嵌套路由、编程式导航、命名路由、路由守卫等 Vue Router 原理 单页应用&#x…...

Tauri v1 与 v2 配置对比

本文档对比 Tauri v1 和 v2 版本的配置结构和内容差异&#xff0c;帮助开发者了解版本变更并进行迁移。 配置结构变化 v1 配置结构 {"package": { ... },"tauri": { "allowlist": { ... },"bundle": { ... },"security":…...

详解 MyBatis-Plus 框架中 QueryWrapper 类

QueryWrapper 一、 QueryWrapper 的概念为什么需要 QueryWrapper&#xff1f; 二、 QueryWrapper 的基本使用1. 创建 QueryWrapper 实例2. 添加查询条件3. 执行查询 三、 QueryWrapper 的常见方法1. 基本条件方法1.1 eq - 等于1.2 ne - 不等于1.3 gt - 大于1.4 ge - 大于等于1.…...

小米MiMo-7B大模型:解锁推理潜力的新传奇!

在大语言模型&#xff08;LLMs&#xff09;蓬勃发展的时代&#xff0c;推理能力成为衡量模型优劣的关键指标。今天为大家解读的这篇论文&#xff0c;介绍了小米的MiMo-7B模型&#xff0c;它通过独特的预训练和后训练优化&#xff0c;展现出强大的推理实力&#xff0c;快来一探究…...

联邦学习的收敛性分析(全设备参与,不同本地训练轮次)

联邦学习的收敛性分析 在联邦学习中,我们的目标是分析全局模型的收敛性,考虑设备异构性(不同用户的本地训练轮次不同)和数据异质性(用户数据分布不均匀)。以下推导从全局模型更新开始,逐步引入假设并推导期望损失的递减关系,最终给出收敛性结论。 1. 全局模型更新与泰…...

硬件工程师面试常见问题(10)

第四十六问&#xff1a;锁存器&#xff0c;触发器&#xff0c;寄存器三者的区别 触发器&#xff1a;能够存储一位二值信号的基本单元电路统称为 "触发器"。&#xff08;单位&#xff09; 锁存器&#xff1a;一位触发器只能传送或存储一位数据&#xff0c;而在实际工…...

1295. 统计位数为偶数的数字

题目 解法一 遍历数组挨个判断元素位数并统计&#xff08;我的第一想法&#xff09; class Solution { public:int findNumbers(vector<int>& nums) {int result 0;for(int n: nums){if(judge(n)) result;}return result;}bool judge(int a){int sum 1;a a / 10…...

3.1/Q1,Charls最新文章解读

文章题目&#xff1a;Social participation patterns and associations with subsequent cognitive function in older adults with cognitive impairment: a latent class analysis DOI&#xff1a;10.3389/fmed.2025.1493359 中文标题&#xff1a;认知障碍老年人的社会参与模…...

楼宇智能化四章【期末复习】

四、火灾自动报警系统 结构组成:火灾探测器、区域报警器、集中报警器 形式:1. 多线制系统 2.总线制系统 3.集中智能系统 4.分布智能系统 5.网络通信系统 工作原理: 以下是关于火灾自动报警系统及相关灭火系统的详细解答: 1. 火灾自动报警系统有哪几种形式? 区…...

Splunk 使用Role 实现数据隔离

很多人知道 Splunk 有很多自带的Role, 今天我就要说说定制化的Role: 1: 在创建新role 的界面: 2: 在如下的界面,可以定制allow index name: 3: 创建好新Role 后,在SAML 添加新的group 的时候,就可以看到Role 给某个group: 4: 这样一个特定组的人来申请Splunk 权限,就可…...

Learning vtkjs之ImplicitBoolean

隐式函数布尔操作 介绍 vtkImplicitBoolean 允许对隐式函数&#xff08;如平面、球体、圆柱体和盒子&#xff09;进行布尔组合。操作包括并集、交集和差集。可以指定多个隐式函数&#xff08;所有函数都使用相同的操作进行组合&#xff09;。 支持的操作&#xff1a;‘UNION…...

LabelVision - yolo可视化标注工具

LabelVision是一款可视化图像标注工具,主要用于计算机视觉研究中的各种标注任务。 支持多边形、矩形、圆形等多种标注方式&#xff0c;并且可以输出JSON、COCO等多种数据格式&#xff0c;方便与其他软件和框架进行集成和互操作。 ‌ 通过它可以很轻易的对图像进行标注,适合Y…...

系统分析师-第十五章

学习目标 通过参加考试&#xff0c;训练学习能力&#xff0c;而非单纯以拿证为目的。 1.在复习过程中&#xff0c;训练快速阅读能力、掌握三遍读书法、运用番茄工作法。 2.从底层逻辑角度理解知识点&#xff0c;避免死记硬背。 3.通过考试验证学习效果。 学习阶段 快速阅读 …...

大连理工大学选修课——机器学习笔记(3):KNN原理及应用

KNN原理及应用 机器学习方法的分类 基于概率统计的方法 K-近邻&#xff08;KNN&#xff09;贝叶斯模型最小均值距离最大熵模型条件随机场&#xff08;CRF&#xff09;隐马尔可夫模型&#xff08;HMM&#xff09; 基于判别式的方法 决策树&#xff08;DT&#xff09;感知机…...

09 Python字典揭秘:数据的高效存储

文章目录 一.字典是什么1.字典的特点 二.字典的创建和使用三.字典的操作1.访问元素2.修改元素3.删除元素4.遍历字典5.成员运算 四.字典方法1.获取字典中的指定元素2.获取字典中的元素3.字典合并4.删除元素 一.字典是什么 在 Python 中&#xff0c;字典&#xff08;dict&#x…...

20250430在ubuntu14.04.6系统上完成编译NanoPi NEO开发板的FriendlyCore系统【严重不推荐,属于没苦硬吃】

【开始编译SDK之前需要更新源】 rootrootubuntu:~/friendlywrt-h3$ sudo apt update 【这两个目录你在ubuntu14.04.6系统上貌似git clone异常了】 Y:\friendlywrt-h3\out\wireguard Y:\friendlywrt-h3\kernel\exfat-nofuse 【需要单线程编译文件系统&#xff0c;原因不明】 Y:…...

第五部分:进阶项目实战

在前面的学习中&#xff0c;我们已经掌握了图像和视频的基础操作、增强滤波、特征提取以及一些基础的目标检测方法。现在&#xff0c;我们将综合运用这些知识来构建一些更复杂、更实用的应用项目。 这一部分的项目将结合前面学到的技术&#xff0c;并介绍一些新的概念和工具&a…...

【Linux】记录一个有用PS1

PS1 是用来定义shell提示符的环境变量 下面是一个带有颜色和丰富信息的 Linux PS1 配置示例&#xff0c;包含用户名、主机名、路径、时间、Git 分支和退出状态提示&#xff1a; # 添加到 ~/.bashrc 文件末尾 PS1\[\e[1;32m\]\u\[\e[m\] # 绿色粗体用户名 PS…...

【SpringBoot】基于mybatisPlus的博客管理系统(2)

目录 1.实现用户登录 Jwt令牌 1.引入依赖 2.生成令牌&#xff08;token&#xff09; Controller Service Mapper 2.实现强制登录 定义拦截器&#xff1a; 配置拦截器&#xff1a; 1.实现用户登录 在之前的项目登录中&#xff0c;我使用的是Session传递用户信息实现校验…...

免费在Colab运行Qwen3-0.6B——轻量高性能实战

Qwen一直在默默地接连推出新模型。 每个模型都配备了如此强大的功能和高度量化的规模,让人无法忽视。 继今年的QvQ、Qwen2.5-VL和Qwen2.5-Omni之后,Qwen团队现在发布了他们最新的模型系列——Qwen3。 这次他们不是发布一个而是发布了八个不同的模型——参数范围从6亿到235…...

精益数据分析(35/26):SaaS商业模式关键指标解析

精益数据分析&#xff08;35/26&#xff09;&#xff1a;SaaS商业模式关键指标解析 在创业与数据分析的征程中&#xff0c;我们持续探索不同商业模式的运营奥秘。今天&#xff0c;我们带着共同进步的期望&#xff0c;深入研读《精益数据分析》&#xff0c;聚焦SaaS商业模式&am…...

【论文速读】《Scaling Scaling Laws with Board Games》

论文链接&#xff1a;https://arxiv.org/pdf/2104.03113 《Scaling Scaling Laws with Board Games》&#xff1a;探索棋盘游戏中的扩展规律 摘要 如今&#xff0c;机器学习领域中规模最大的实验所需的资源&#xff0c;超出了仅有几家机构的预算。幸运的是&#xff0c;最近的…...

C++ 与多技术融合的深度实践:从 AI 到硬件的全栈协同

在数字化技术高速发展的今天&#xff0c;C 凭借其卓越的性能优势和底层控制能力&#xff0c;成为连接上层应用与底层硬件的核心纽带。这种独特定位使其在与 AI 深度学习、Python 生态及硬件加速技术的融合中展现出不可替代的价值&#xff0c;构建起从算法实现到硬件优化的全栈技…...

AdaBoost算法的原理及Python实现

一、概述 AdaBoost&#xff08;Adaptive Boosting&#xff0c;自适应提升&#xff09;是一种迭代式的集成学习算法&#xff0c;通过不断调整样本权重&#xff0c;提升弱学习器性能&#xff0c;最终集成为一个强学习器。它继承了 Boosting 的基本思想和关键机制&#xff0c;但在…...

无刷马达驱动芯片算法逐步革新着风扇灯行业--其利天下

风扇灯市场热度持续攀升&#xff0c;根据行业数据&#xff0c;风扇灯市场规模从2010年的100亿元增长至2019年的200亿元&#xff0c;年均复合增长率超10%&#xff0c;预计2025年将达30%&#xff0c;借此其利天下有限公司进一步提升了无刷风扇灯驱动方案。 一、性能参数 电压&a…...

数据库系统综合应用与深度实践指南

前言 在当今数据驱动的时代&#xff0c;数据库技术已成为信息系统的核心支柱。从简单的数据存储到复杂的企业级应用&#xff0c;数据库系统支撑着现代社会的方方面面。本文作为一篇综合性的数据库科普文章&#xff0c;旨在为读者提供从基础到进阶的完整知识体系&#xff0c;涵…...

「Unity3D」TextMeshPro使用TMP_InputField实现,输入框高度自动扩展与收缩

先看实现效果&#xff1a; 要实现这个效果&#xff0c;有三个方面的问题需要解决&#xff1a; 第一&#xff0c;输入框的高度扩展&#xff0c;内部子元素会随着锚点&#xff0c;拉伸变形——要解决这个问题&#xff0c;需要将内部元素改变父类&#xff0c;然后增加父类高度&am…...

SAP-ABAP:在SAP系统中,COEP表(成本控制对象行项目表)详解

在SAP系统中&#xff0c;**COEP表&#xff08;成本控制对象行项目表&#xff09;**是成本控制&#xff08;CO&#xff09;模块的核心数据表之一&#xff0c;主要用于存储与成本核算相关的详细行项目数据。以下是对其作用的详细解析&#xff1a; 一、 COEP表的核心作用 存储成本…...

crashpad 编译

一环境配置 1.1设置系统UTF8编码 1.2vs2017语言环境设置英文包 二.获取depot_tools&#xff08;此步骤可以跳过 最新工具包已上传下载使用即可&#xff09; windows下载压缩包&#xff0c;然后放到系统PATH中 下载完以后&#xff0c;基本就是靠depot_tools这个工具集合了&am…...

Windows系统安装Docker(Win10系统升级,然后安装)

有时需要在自己笔记本跑下代码&#xff0c;所以安装Dockers&#xff0c;步骤如下&#xff1a; 1. 升级系统&#xff08;Windows10专业版或者Windows11&#xff09; Windows10家庭版装Docker较麻烦&#xff0c;所以我将Win10升级为Win11了&#xff08;免费&#xff09;&#x…...

【Fifty Project - D21】

今日完成记录 TimePlan完成情况9&#xff1a;00 - 10&#xff1a;00爬楼梯√12&#xff1a;00 - 14&#xff1a;00Leetcode√14&#xff1a;00 - 15&#xff1a;00《挪威的森林》√ Leetcode 每日一题 今天的每日一题是个easy&#xff1a;给定一个数组&#xff0c;要求统计…...

中央网信办部署开展“清朗·整治AI技术滥用”专项行动

为规范AI服务和应用&#xff0c;促进行业健康有序发展&#xff0c;保障公民合法权益&#xff0c;近日&#xff0c;中央网信办印发通知&#xff0c;在全国范围内部署开展为期3个月的“清朗整治AI技术滥用”专项行动。 中央网信办有关负责人表示&#xff0c;本次专项行动分两个阶…...

《Python实战进阶》 No46:CPython的GIL与多线程优化

Python实战进阶 No46&#xff1a;CPython的GIL与多线程优化 摘要 全局解释器锁&#xff08;GIL&#xff09;是CPython的核心机制&#xff0c;它保证了线程安全却限制了多核性能。本节通过concurrent.futures、C扩展优化和多进程架构&#xff0c;实战演示如何突破GIL限制&#…...

BOTA新六维力传感器PixONE:用12维度力矩与运动感测,驱动人形机器人力控未来

在机器人技术日益发展的今天&#xff0c;六维力传感器对于提升机器人感知环境、增强操作精度发挥着重要作用。瑞士BOTA Systems是一家专注于机器人传感器技术的公司&#xff0c;致力于为原始设备制造商提供高性能的传感器解决方案。 PixONE是BOTA推出的一款创新的高精度传感器&…...

《PyTorch documentation》(PyTorch 文档)

PyTorch documentation(PyTorch 文档) PyTorch is an optimized tensor library for deep learning using GPUs and CPUs. (PyTorch是一个优化的张量库,用于使用GPU和CPU进行深度学习。) Features described in this documentation are classified by release status: (此…...

数据库的死锁相关(一)

目录 前言 一、什么死锁 二、产生死锁的必要条件 三、死锁发生的具体位置和场景 1. 数据行级别死锁&#xff08;最常见&#xff09; 2. 表级别死锁 3. 索引间隙锁死锁&#xff08;InnoDB特有&#xff09; 4. 外键约束死锁 5. 元数据锁死锁 6. 内存中的锁结构死锁 7.…...

数据编码(Encoding)

对数据做编码可以减少存储和 I/O开销,常见的技术比如 Dictionary Encoding,Run-Length Encoding,Bitpacking,Delta Encoding,Frame-of-Reference等。 本篇文章对这些编码方案进行介绍,举例说明,最后总结各种encoding的适用场景。 一、Dictionary Encoding(字典编码)…...

Wartales 战争传说 [DLC 解锁] [Steam] [Windows SteamOS]

Wartales 战争传说 [DLC 解锁] [Steam] [Windows & SteamOS] DLC 版本 至最新全部 DLC 后续可能无法及时更新文章&#xff0c;具体最新版本见下载文件说明 DLC 解锁列表&#xff08;仅供参考&#xff09; 《战争传说》 - Pirates of Belerion 《战争传说》 - The Tavern …...

决策树在电信客户流失分析中的实战应用

在当今数据驱动的时代&#xff0c;数据分析和机器学习技术在各行业的应用愈发广泛。电信行业面临着激烈的竞争&#xff0c;客户流失问题成为影响企业发展的关键因素之一。如何准确预测客户是否会流失&#xff0c;并采取相应措施挽留客户&#xff0c;是电信企业关注的重点。决策…...

滚珠丝杆怎么选型?

滚珠丝杆的选型需要考虑多个因素&#xff0c;包括应用需求、性能参数、环境因素等&#xff0c;以确保选型的准确性和合理性。 1、负载&#xff1a;确定设备运行时滚珠丝杆需要承受的静载荷和动载荷&#xff0c;包括轴向载荷和径向载荷&#xff0c;根据实际工作情况计算出最大负…...

HTN77A0原理图提供聚能芯半导体禾润一级代理技术支持免费送样

在电源管理需求日益严苛的当下&#xff0c;禾润 HTN77A0 以卓越性能脱颖而出。它不仅适配多种应用场景&#xff0c;还兼具高效节能与稳定输出&#xff0c;为设备供能带来革新体验。 禾润 HTN77A0 同步降压变换器&#xff0c;凭借5V~130V 超宽输入电压范围&#xff0c;打破传统供…...

linux中sigint和sigterm的区别

SIGINT 和 SIGTERM 是在 Unix 及类 Unix 系统&#xff08;包括 Linux&#xff09;中用于进程间通信的信号&#xff0c;它们都可以用于请求进程终止&#xff0c;区别如下&#xff1a; 1、信号编号与定义 在信号机制里&#xff0c;每个信号都有对应的编号&#xff0c;这便于系统…...

errorno 和WSAGetlasterror的区别

errno 和 WSAGetLastError 是用于获取错误代码的机制&#xff0c;但它们应用于不同的编程场景&#xff0c;下面为你详细介绍二者的区别&#xff1a; 应用场景 errno&#xff1a;它是 C 和 C 等编程语言里用于表示系统调用和库函数错误的全局变量。在 Unix、Linux 等类 Unix 系…...

《操作系统真象还原》第十一章——用户进程

文章目录 前言为什么要有TSSTSS简介TSS描述符和TSS结构现代操作系统采用的任务切换方式 定义并初始化TSS修改global.h编写tss.c测试 实现用户进程实现用户进程的原理维护虚拟地址空间&#xff0c;修改thread.h为进程创建页表和3特权级栈&#xff0c;修改memory.c进入特权级3用户…...