面向对象四大核心:封装、继承、多态、抽象 基础单位:类(模板)、对象(实例 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();
}

八、核心区分总结

  1. 封装:private + 属性,保护数据;
  2. 继承 class A : B:复用代码,单继承;
  3. 多态 virtual + override:父类引用调用不同子类逻辑;
  4. 抽象 abstract 类:有部分实现,强制子类补全抽象方法;
  5. interface 接口:纯标准,支持多实现,弥补单继承限制。

更多推荐