2.面向对象C#
·
面向对象四大核心:封装、继承、多态、抽象 基础单位:类(模板)、对象(实例 new 出来)
二、封装(隐藏数据,对外提供访问入口)
结构图
plaintext
Person 类
├─ 私有字段 _age(外部无法直接访问)
└─ 公开属性 Age {get;set;} 做数据校验
C# 代码
csharp
运行
class Person
{
// 私有字段 封装隐藏
private int _age;
// 公开属性 对外访问
public string Name { get; set; }
public int Age
{
get
{
return _age;
}
set
{
// 数据校验,非法值拦截
if (value >= 0 && value <= 150)
{
_age = value;
}
else
{
Console.WriteLine("年龄不合法!");
}
}
}
// 成员方法
public void SayHi()
{
Console.WriteLine($"我是{Name},今年{Age}岁");
}
}
// 调用
class Program
{
static void Main()
{
Person p = new Person();
p.Name = "张三";
p.Age = 20;
p.SayHi();
p.Age = 200; // 会提示不合法
}
}
三、继承(子类复用父类代码,C# 单继承)
结构图
plaintext
父类 Animal
├─ 属性 Name
└─ 方法 Eat()
↑ 继承
┌───────┴───────┐
Dog类 Cat类
自有Bark() 自有Mew()
C# 代码
csharp
运行
// 父类
class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name}正在吃东西");
}
}
// 子类狗,继承Animal
class Dog : Animal
{
// 子类自有方法
public void Bark()
{
Console.WriteLine("汪汪汪");
}
}
// 子类猫
class Cat : Animal
{
public void Mew()
{
Console.WriteLine("喵喵喵");
}
}
// 调用
static void Main()
{
Dog dog = new Dog();
dog.Name = "旺财";
dog.Eat(); // 继承父类方法
dog.Bark();// 自己独有的方法
Cat cat = new Cat();
cat.Name = "橘猫";
cat.Eat();
cat.Mew();
}
四、多态(父类引用指向子类对象,重写方法不同实现)
结构图
plaintext
父类 Animal
virtual void Eat()
↑
Dog override Eat()
Cat override Eat()
Animal a = new Dog(); // 多态写法
a.Eat(); 执行狗的吃饭逻辑
C# 代码
csharp
运行
class Animal
{
public string Name { get; set; }
// virtual 标记可重写
public virtual void Eat()
{
Console.WriteLine("动物进食");
}
}
class Dog : Animal
{
// override 重写父类虚方法
public override void Eat()
{
Console.WriteLine($"{Name}啃骨头");
}
}
class Cat : Animal
{
public override void Eat()
{
Console.WriteLine($"{Name}吃鱼");
}
}
static void Main()
{
// 多态核心写法:父类变量接收子类实例
Animal a1 = new Dog();
a1.Name = "旺财";
a1.Eat(); // 执行Dog重写的Eat
Animal a2 = new Cat();
a2.Name = "咪咪";
a2.Eat(); // 执行Cat重写的Eat
}
五、抽象类(abstract,不能实例化,包含抽象方法强制子类实现)
结构图
plaintext
抽象类 Shape 无法new
├─ 普通属性 Color
├─ 普通方法 ShowColor()
└─ 抽象方法 abstract GetArea(); 无方法体
↑
Circle、Rectangle 必须实现GetArea
C# 代码
csharp
运行
// 抽象类
abstract class Shape
{
public string Color { get; set; }
// 普通方法,有实现
public void ShowColor()
{
Console.WriteLine($"图形颜色:{Color}");
}
// 抽象方法:只有声明,没有代码,子类必须重写
public abstract double GetArea();
}
// 圆形子类
class Circle : Shape
{
public double Radius { get; set; }
// 强制实现抽象方法
public override double GetArea()
{
return Math.PI * Radius * Radius;
}
}
// 矩形子类
class Rectangle : Shape
{
public double Width { get; set; }
public double Height { get; set; }
public override double GetArea()
{
return Width * Height;
}
}
static void Main()
{
Shape c = new Circle();
c.Color = "红色";
c.Radius = 5;
c.ShowColor();
Console.WriteLine("圆面积:" + c.GetArea());
Shape r = new Rectangle();
r.Width = 3;
r.Height = 4;
Console.WriteLine("矩形面积:" + r.GetArea());
}
六、接口(interface,纯规范,多实现,无字段无实现)
结构图
plaintext
接口 IMove 只有方法声明
void Run();
void Jump();
Dog 实现 IMove
Bird 实现 IMove
一个类可以同时实现多个接口
C# 代码
csharp
运行
// 接口,只定义行为规范
interface IMove
{
void Run();
void Jump();
}
// 狗实现移动接口
class Dog : IMove
{
public void Run()
{
Console.WriteLine("狗四条腿奔跑");
}
public void Jump()
{
Console.WriteLine("狗原地蹦跳");
}
}
// 鸟类同时实现IMove和另一个接口
interface IFly
{
void Fly();
}
class Bird : IMove, IFly
{
public void Run()
{
Console.WriteLine("小鸟地上小跑");
}
public void Jump()
{
Console.WriteLine("小鸟轻轻跳跃");
}
public void Fly()
{
Console.WriteLine("小鸟展翅飞翔");
}
}
static void Main()
{
IMove dog = new Dog();
dog.Run();
dog.Jump();
Bird bird = new Bird();
bird.Run();
bird.Fly();
}
七、综合完整版结构 + 整合代码示例
整体层级结构图
plaintext
接口 IStudent
↓实现
抽象类 Person
↓继承
Student 子类、Teacher子类
csharp
运行
// 接口
interface IStudent
{
void Study();
}
// 抽象父类
abstract class Person
{
public string Name { get; set; }
public void Say()
{
Console.WriteLine($"我叫{Name}");
}
public abstract void Work();
}
// 学生:继承抽象类 + 实现接口
class Student : Person, IStudent
{
public override void Work()
{
Console.WriteLine("学生的工作是上课");
}
public void Study()
{
Console.WriteLine("正在学习编程");
}
}
// 老师:只继承抽象类
class Teacher : Person
{
public override void Work()
{
Console.WriteLine("老师的工作是讲课");
}
public void Teach()
{
Console.WriteLine("讲授面向对象知识");
}
}
static void Main()
{
Student s = new Student();
s.Name = "小李";
s.Say();
s.Work();
s.Study();
Teacher t = new Teacher();
t.Name = "王老师";
t.Say();
t.Work();
t.Teach();
}
八、核心区分总结
- 封装:private + 属性,保护数据;
- 继承 class A : B:复用代码,单继承;
- 多态 virtual + override:父类引用调用不同子类逻辑;
- 抽象 abstract 类:有部分实现,强制子类补全抽象方法;
- interface 接口:纯标准,支持多实现,弥补单继承限制。
更多推荐
所有评论(0)