这是一套为新生设计的面向对象编程教学代码,涵盖 C++, C#, TypeScript 和 Go 等多种语言,逐步深化 OOP 的核心概念。
目录: 01-cpp-basics/
核心概念:
public, private, protected)文件:
device.h - 设备类的层级定义main.cpp - 演示代码g++ main.cpp -o main 或在 VS Code 中调试为什么从 C++ 开始?
目录: 02-csharp-interface/
核心概念:
文件结构 (支持 Linux/Windows):
├── Interfaces.cs # 接口定义 ├── DeviceClasses.cs # 具体类实现 ├── AbstractClasses.cs # 抽象类演示 ├── Utilities.cs # 工具函数 ├── Program.cs # 多个示例程序类 └── *.csproj # 项目配置
使用方式:
完整演示 (默认):
dotnet run
这将运行 Program 类中的完整演示
学生实验 (取消注释运行单个示例):
在 Program.cs 中,每个示例都被注释包围:
/*
class Example1_MultipleInterfaces
{
static void Main() { ... }
}
*/
步骤:
Program 类的 Main() 方法dotnet run调试支持:
为什么用 C# 讲接口?
关键示例:
Example1: 多接口实现 (SmartPhone 同时实现 IChargeable, IPhotographer, ICallable)Example2: 充电站 (接受任何 IChargeable 设备)Example3: 摄影工作室 (接受任何 IPhotographer 设备)Example4: 接口数组 (统一管理不同类型的对象)Example5: 抽象类 (MediaPlayer 的不同实现)目录: 03-typescript-prototype/
核心概念:
class 语法糖说明: 这个阶段可根据时间灵活调整。
目录: 04-go-composition/
核心概念:
implements 声明)文件结构 (独立 Go 项目):
├── main.go # 演示入口和总结 ├── 01_implicit_interfaces.go # 接口的隐式实现 ├── 02_struct_embedding.go # 结构体嵌入(组合) └── go.mod # Go 模块
运行方式:
cd 04-go-composition
go run .
教学重点:
两个核心概念:
接口的隐式实现 (01_implicit_interfaces.go):
implements 关键字结构体嵌入 (02_struct_embedding.go):
为什么最后讲 Go?
# C++
cd 01-cpp-basics
g++ main.cpp -o main
./main
# C#
cd 02-csharp-interface
dotnet run
# Go
cd 04-go-composition
go run main.go
# C++ (PowerShell)
cd 01-cpp-basics
g++ main.cpp -o main.exe
.\main.exe
# C#
cd 02-csharp-interface
dotnet run
# Go
cd 04-go-composition
go run main.go
目标: 理解接口和多态
任务:
02-csharp-interface/DeviceClasses.csLaptop 实现 IChargeable 和 IPhotographerProgram.cs 中创建实例并测试提示:
class Laptop : Device, IChargeable, IPhotographer
{
public int BatteryLevel { get; private set; } = 60;
public int MegaPixels { get; private set; }
// 实现接口...
}
目标: 理解接口的隐式实现
任务:
04-go-composition/01_implicit_interfaces.goDatabase 实现 Writer 和 Readermain.go 中创建实例并测试提示:
type Database struct {
Name string
Table string
}
func (db *Database) Write(data string) error {
// 实现 Writer 接口
return nil
}
func (db *Database) Read() (string, error) {
// 实现 Reader 接口
return "", nil
}
目标: 理解 struct 嵌入和组合
任务:
04-go-composition/02_struct_embedding.goFish (只能游泳,不能飞行)Eagle (只能飞行,不能游泳)提示:
type Fish struct {
Animal
SwimAbility
// 没有 Wings
}
type Eagle struct {
Animal
Wings
// 没有 SwimAbility
}
| 概念 | C++ | C# | Go |
|---|---|---|---|
| 继承 | ✅ 单继承 | ✅ 单继承 | ❌ 无继承 |
| 接口 | ❌ 虚函数 | ✅ 正式接口 | ✅ 隐式接口 |
| 多实现 | ❌ 不支持 | ✅ 支持 | ✅ 支持 |
| 多态 | ✅ 虚函数 | ✅ 接口/抽象类 | ✅ 接口 |
| 访问控制 | ✅ public/private/protected | ✅ public/private | ✅ Exported/unexported |
| 哲学 | 面向继承 | 面向接口 | 面向组合 |
// launch.json 示例
{
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Launch",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/02-csharp-interface/bin/Debug/net8.0/02-csharp-interface.dll",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false
}
]
}
// launch.json 示例
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/04-go-composition",
"env": {},
"args": []
}
]
}
学生应该记录:
C++ 阶段:
C# 阶段:
Go 阶段:
Q: 为什么要学这么多种语言? A: 每种语言都代表了 OOP 思想的不同诠释。学习多种语言能帮你理解 OOP 的本质,而不是某个语言的特定语法。
Q: 为什么 Go 没有继承? A: Go 的设计者认为继承会创建复杂的继承树,而组合(嵌入)+接口足以应对所有场景,反而更清晰灵活。
Q: Go 的接口隐式实现是什么意思?
A: 在 C#/Java 中,你要写 class Dog : IAnimal { }。在 Go 中,你只需写对应的方法,Go 会自动认为你实现了这个接口。无需声明。
Q: struct 嵌入和继承有什么区别? A: 继承是"是什么"(is-a),嵌入是"有什么"(has-a)。Duck 不是 Bird,而是有 Bird 的能力(和其他能力)。
Q: 我不懂 Go,能教吗?
A: 可以。04-go-composition 的代码很简洁,只有接口和嵌入两个概念,讲解的是设计思想而不是 Go 语法细节。
作者: Created for OOP Teaching
版本: 1.0
最后更新: 2026-01-19