1基础练习考察抽象类的定义抽象方法定义抽象方法实现 难度⭐需求定义一个抽象类Shape包含抽象方法GetArea()返回面积double类型抽象方法GetPerimeter()返回周长double类型一个普通方法DisplayInfo()打印面积和周长创建两个派生类Circle圆属性 Radius半径Rectangle矩形属性 Width 和 Height要求实现所有抽象方法并在Main中测试计算圆和矩形的面积、周长。参考答案using System; abstract class Shape { public abstract double GetArea(); public abstract double GetPerimeter(); public void DisplayInfo() { Console.WriteLine($面积: {GetArea():F2}, 周长: {GetPerimeter():F2}); } } class Circle : Shape { public double Radius { get; set; } public Circle(double radius) { Radius radius; } public override double GetArea() { return Math.PI * Radius * Radius; } public override double GetPerimeter() { return 2 * Math.PI * Radius; } } class Rectangle : Shape { public double Width { get; set; } public double Height { get; set; } public Rectangle(double width, double height) { Width width; Height height; } public override double GetArea() { return Width * Height; } public override double GetPerimeter() { return 2 * (Width Height); } } // 测试代码 class Program { static void Main() { Shape circle new Circle(5); Shape rectangle new Rectangle(4, 6); circle.DisplayInfo(); rectangle.DisplayInfo(); } }2、基础练习考察抽象类的定义抽象方法定义抽象方法实现 难度⭐需求创建一个抽象类Employee包含属性Name姓名string、ID工号string抽象方法CalculateSalary()计算月薪返回 double虚方法DisplayInfo()显示员工基本信息创建三个派生类FullTimeEmployee全职员工固定月薪BasicSalaryPartTimeEmployee兼职员工时薪HourlyRate× 工作小时数HoursWorkedSalesEmployee销售员工底薪BaseSalary 销售额Sales× 提成比例CommissionRate默认0.05要求在Main中创建一个员工列表计算并显示所有员工的工资利用多态性调用CalculateSalary()和DisplayInfo()参考答案using System; using System.Collections.Generic; abstract class Employee { public string Name { get; set; } public string ID { get; set; } public abstract double CalculateSalary(); public virtual void DisplayInfo() { Console.WriteLine($姓名: {Name}, 工号: {ID}, 工资: {CalculateSalary():C}); } } class FullTimeEmployee : Employee { public double BasicSalary { get; set; } public FullTimeEmployee(string name, string id, double basicSalary) { Name name; ID id; BasicSalary basicSalary; } public override double CalculateSalary() { return BasicSalary; } } class PartTimeEmployee : Employee { public double HourlyRate { get; set; } public double HoursWorked { get; set; } public PartTimeEmployee(string name, string id, double hourlyRate, double hoursWorked) { Name name; ID id; HourlyRate hourlyRate; HoursWorked hoursWorked; } public override double CalculateSalary() { return HourlyRate * HoursWorked; } } class SalesEmployee : Employee { public double BaseSalary { get; set; } public double Sales { get; set; } public double CommissionRate { get; set; } 0.05; public SalesEmployee(string name, string id, double baseSalary, double sales) { Name name; ID id; BaseSalary baseSalary; Sales sales; } public override double CalculateSalary() { return BaseSalary Sales * CommissionRate; } } class Program { static void Main() { ListEmployee employees new ListEmployee { new FullTimeEmployee(张三, 001, 8000), new PartTimeEmployee(李四, 002, 50, 120), new SalesEmployee(王五, 003, 3000, 100000) }; foreach (var emp in employees) { emp.DisplayInfo(); } } }3、基础练习考察接口、抽象类、抽象方法的定义 难度⭐需求定义一个接口IComparable自定义非System接口包含方法CompareTo(object obj)返回 int大于返回1等于返回0小于返回-1。定义一个抽象类Animal包含属性Name名字、Age年龄抽象方法MakeSound()发出声音实现IComparable接口按年龄比较创建两个派生类Dog实现MakeSound()输出 Woof!Cat实现MakeSound()输出 Meow!要求创建 Animal 数组包含多个 Dog 和 Cat 对象对数组按年龄进行排序使用自定义的CompareTo方法遍历数组调用每个动物的MakeSound()方法参考答案using System; interface IComparable { int CompareTo(object obj); } abstract class Animal : IComparable { public string Name { get; set; } public int Age { get; set; } public abstract void MakeSound(); public int CompareTo(object obj) { if (obj is Animal other) { return this.Age.CompareTo(other.Age); } return 0; } } class Dog : Animal { public override void MakeSound() { Console.WriteLine(${Name} (狗): Woof!); } } class Cat : Animal { public override void MakeSound() { Console.WriteLine(${Name} (猫): Meow!); } } class Program { static void Main() { Animal[] animals new Animal[] { new Dog { Name 旺财, Age 5 }, new Cat { Name 咪咪, Age 2 }, new Dog { Name 小黑, Age 8 }, new Cat { Name 花花, Age 3 } }; // 冒泡排序简单实现 for (int i 0; i animals.Length - 1; i) { for (int j 0; j animals.Length - i - 1; j) { if (animals[j].CompareTo(animals[j 1]) 0) { var temp animals[j]; animals[j] animals[j 1]; animals[j 1] temp; } } } Console.WriteLine(按年龄排序后的动物:); foreach (var animal in animals) { Console.Write($年龄: {animal.Age} - ); animal.MakeSound(); } } }4、基础练习考察抽象类、虚方法 难度⭐需求设计一个银行账户系统抽象类BankAccount属性AccountNumber账号、Balance余额protected抽象方法Deposit(double amount)存款、Withdraw(double amount)取款虚方法DisplayBalance()显示余额派生类SavingsAccount储蓄账户取款不能超过余额存款有利息年利率 3%存款时自动计算利息并加入余额CheckingAccount支票账户允许透支透支额度 500每次取款收取 2 元手续费要求实现所有方法在Main中演示存款、取款操作并显示最终余额确保业务逻辑正确如储蓄账户不能超额取款参考代码using System; abstract class BankAccount { public string AccountNumber { get; set; } protected double Balance { get; set; } public BankAccount(string accountNumber, double initialBalance) { AccountNumber accountNumber; Balance initialBalance; } public abstract void Deposit(double amount); public abstract void Withdraw(double amount); public virtual void DisplayBalance() { Console.WriteLine($账号: {AccountNumber}, 当前余额: {Balance:C}); } } // 储蓄账户 class SavingsAccount : BankAccount { private const double InterestRate 0.03; // 年利率3% public SavingsAccount(string accountNumber, double initialBalance) : base(accountNumber, initialBalance) { } public override void Deposit(double amount) { if (amount 0) { Console.WriteLine(存款金额必须大于0); return; } double interest amount * InterestRate; Balance amount interest; Console.WriteLine($存入 {amount:C}获得利息 {interest:C}余额: {Balance:C}); } public override void Withdraw(double amount) { if (amount 0) { Console.WriteLine(取款金额必须大于0); return; } if (amount Balance) { Console.WriteLine(余额不足取款失败); return; } Balance - amount; Console.WriteLine($取出 {amount:C}剩余余额: {Balance:C}); } } // 支票账户可透支 class CheckingAccount : BankAccount { private const double OverdraftLimit 500; private const double WithdrawFee 2; public CheckingAccount(string accountNumber, double initialBalance) : base(accountNumber, initialBalance) { } public override void Deposit(double amount) { if (amount 0) { Console.WriteLine(存款金额必须大于0); return; } Balance amount; Console.WriteLine($存入 {amount:C}余额: {Balance:C}); } public override void Withdraw(double amount) { if (amount 0) { Console.WriteLine(取款金额必须大于0); return; } double totalDeduction amount WithdrawFee; if (Balance - totalDeduction -OverdraftLimit) { Console.WriteLine($超出透支额度 {OverdraftLimit:C}取款失败); return; } Balance - totalDeduction; Console.WriteLine($取出 {amount:C}手续费 {WithdrawFee:C}余额: {Balance:C}); } } // 测试代码 class Program { static void Main() { Console.WriteLine( 储蓄账户测试 ); BankAccount savings new SavingsAccount(SAV001, 1000); savings.DisplayBalance(); savings.Deposit(500); savings.Withdraw(200); savings.Withdraw(2000); // 尝试超额取款 savings.DisplayBalance(); Console.WriteLine(\n 支票账户测试 ); BankAccount checking new CheckingAccount(CHK001, 200); checking.DisplayBalance(); checking.Withdraw(100); // 正常取款 checking.Withdraw(600); // 尝试超额透支 checking.Deposit(300); checking.Withdraw(500); // 允许透支未超限 checking.DisplayBalance(); } }5、基础练习考察抽象类、里氏替换 难度⭐⭐1. 创建抽象类Animal包含以下成员属性string Name动物名称int Age年龄构造方法带参数的构造函数初始化Name和Age抽象方法void MakeSound()- 动物发出叫声虚方法void Eat()- 吃东西默认输出{Name} 正在吃东西void Sleep()- 睡觉默认输出{Name} 正在睡觉普通方法void DisplayInfo()- 显示动物信息名称、年龄2. 创建三个派生类Dog狗实现MakeSound()输出 汪汪汪重写Eat()输出 {Name} 正在啃骨头有一个自己的方法Like():输出狗摇尾巴表示喜欢Cat猫实现MakeSound()输出 喵喵喵重写Sleep()输出 {Name} 正在打呼噜 zzzDuck鸭子实现MakeSound()输出 嘎嘎嘎保持Eat()和Sleep()为父类默认实现3、在Main方法种测试实例化一个Dog对象(旺财3),实例化一个猫对象大黄2实例化一个鸭子对象小鸭子1然后放入数组或者List泛型集合然后遍历数组或集合种的每个对象并让遍历的每个对象调用以下方法DisplayInfo()MakeSound()Eat()Sleep()参考答案using System; using System.Collections.Generic; public abstract class Animal { public string Name { get; set; } public int Age { get; set; } public Animal(string name, int age) { // 在父类统一处理验证确保所有子类继承相同的规则 if (string.IsNullOrEmpty(name)) throw new ArgumentException(动物名称不能为空); if (age 0) throw new ArgumentException(年龄不能为负数); Name name; Age age; } public abstract void MakeSound(); public virtual void Eat() { Console.WriteLine(${Name} 正在吃东西); } public virtual void Sleep() { Console.WriteLine(${Name} 正在睡觉); } public void DisplayInfo() { Console.WriteLine($名称: {Name}, 年龄: {Age}岁); } } public class Dog : Animal { public Dog(string name, int age) : base(name, age) { } public override void MakeSound() { Console.WriteLine(汪汪汪); } public override void Eat() { Console.WriteLine(${Name} 正在啃骨头); } // 添加新方法实现狗的独特行为而不是改变现有方法语义 public void Guard() { Console.WriteLine(${Name} 正在看家护院); } } public class Cat : Animal { public Cat(string name, int age) : base(name, age) { } public override void MakeSound() { Console.WriteLine(喵喵喵); } public override void Sleep() { Console.WriteLine(${Name} 正在打呼噜 zzz); } public void CatchMouse() { Console.WriteLine(${Name} 正在抓老鼠); } } public class Duck : Animal { public Duck(string name, int age) : base(name, age) { } public override void MakeSound() { Console.WriteLine(嘎嘎嘎); } // 可选重写Eat体现鸭子的特性 public override void Eat() { Console.WriteLine(${Name} 正在吃小鱼); } // 添加鸭子的独特行为 public void Swim() { Console.WriteLine(${Name} 正在游泳); } }思考如果在遍历每个对象后判断出来哪个对象是狗的对象去调用独有的Like方法6、模拟一个简单的校园人员管理demo管理学生和老师考察接口的多实现 难度⭐定义 人员基本信息接口public interface IPerson{string Id { get; } // 学号/工号string Name { get; set; } // 姓名int Age { get; set; } // 年龄void Introduce(); // 自我介绍}定义学习者接口public interface ILearner{void Study(string subject); // 学习课程int GetCredits(); // 获取已修学分}定义 授课者接口public interface ITeacher{void Teach(string subject); // 教授课程int GetTeachingHours(); // 获取授课时长}要求创建Student类要求实现接口IPerson,ILearner额外属性Major专业、Credits学分Study()方法输出{Name} 正在学习 {subject}GetCredits()返回学分创建Teacher类要求实现接口IPerson,ITeacher额外属性Subject教授科目、TeachingHours授课时长Teach()方法输出{Name} 正在教授 {subject}GetTeachingHours()返回授课时长创建TeachingAssistant类助教要求实现接口IPerson,ILearner,ITeacher额外属性Major专业、Subject助教科目、Credits学分、TeachingHours助教时长Study()输出{Name} 正在学习 {subject}Teach()输出{Name} 正在协助教授 {subject}Introduce()输出{Name}我是{专业}专业的助教在Main方法中分别创建学生、老师、助教的对象调用各自的方法测试多态性用子类构造方法创建接口的对象。using System; namespace CampusManagementSystem { // 接口定义 // 1. 人员基本信息接口 public interface IPerson { string Id { get; } // 学号/工号 string Name { get; set; } // 姓名 int Age { get; set; } // 年龄 void Introduce(); // 自我介绍 } // 2. 学习者接口 public interface ILearner { void Study(string subject); // 学习课程 int GetCredits(); // 获取已修学分 } // 3. 授课者接口 public interface ITeacher { void Teach(string subject); // 教授课程 int GetTeachingHours(); // 获取授课时长 } // 类的实现 // 学生类 public class Student : IPerson, ILearner { // 实现 IPerson 接口属性 public string Id { get; private set; } public string Name { get; set; } public int Age { get; set; } // 学生特有属性 public string Major { get; set; } public int Credits { get; set; } // 构造函数 public Student(string id, string name, int age, string major) { Id id; Name name; Age age; Major major; Credits 0; } public Student(string id, string name, int age, string major, int credits) { Id id; Name name; Age age; Major major; Credits credits; } // 实现 IPerson 接口方法 public void Introduce() { Console.WriteLine($我是{Name}学号{Id}今年{Age}岁专业{Major}); } // 实现 ILearner 接口方法 public void Study(string subject) { Console.WriteLine(${Name} 正在学习 {subject}); } public int GetCredits() { return Credits; } } // 老师类 public class Teacher : IPerson, ITeacher { // 实现 IPerson 接口属性 public string Id { get; private set; } public string Name { get; set; } public int Age { get; set; } // 老师特有属性 public string Subject { get; set; } public int TeachingHours { get; set; } // 构造函数 public Teacher(string id, string name, int age, string subject, int teachingHours) { Id id; Name name; Age age; Subject subject; TeachingHours teachingHours; } // 实现 IPerson 接口方法 public void Introduce() { Console.WriteLine($我是{Name}工号{Id}今年{Age}岁教授科目{Subject}); } // 实现 ITeacher 接口方法 public void Teach(string subject) { Console.WriteLine(${Name} 正在教授 {subject}); } public int GetTeachingHours() { return TeachingHours; } } // 助教类实现三个接口 public class TeachingAssistant : IPerson, ILearner, ITeacher { // 实现 IPerson 接口属性 public string Id { get; private set; } public string Name { get; set; } public int Age { get; set; } // 学生相关属性 public string Major { get; set; } public int Credits { get; set; } // 老师相关属性 public string Subject { get; set; } public int TeachingHours { get; set; } // 构造函数 public TeachingAssistant(string id, string name, int age, string major, string subject, int credits, int teachingHours) { Id id; Name name; Age age; Major major; Subject subject; Credits credits; TeachingHours teachingHours; } // 实现 IPerson 接口方法 public void Introduce() { Console.WriteLine($我是{Name}工号{Id}今年{Age}岁{Major}专业的助教); } // 实现 ILearner 接口方法作为学生 public void Study(string subject) { Console.WriteLine(${Name} 正在学习 {subject}); } public int GetCredits() { return Credits; } // 实现 ITeacher 接口方法作为老师 public void Teach(string subject) { Console.WriteLine(${Name} 正在协助教授 {subject}); } public int GetTeachingHours() { return TeachingHours; } } // 测试代码 class Program { static void Main(string[] args) { Console.WriteLine( 校园人员管理系统 \n); // 创建学生、老师、助教对象 Student student new Student(S001, 张三, 20, 计算机科学); Teacher teacher new Teacher(T001, 李教授, 45, C#编程, 20); TeachingAssistant ta new TeachingAssistant(TA001, 王助教, 25, 软件工程, C#编程, 30, 10); // 测试学生 Console.WriteLine( 学生信息 ); student.Introduce(); student.Study(C#编程); Console.WriteLine($已获得学分: {student.GetCredits()}分\n); // 测试老师 Console.WriteLine( 老师信息 ); teacher.Introduce(); teacher.Teach(设计模式); Console.WriteLine($授课时长: {teacher.GetTeachingHours()}小时\n); // 测试助教 Console.WriteLine( 助教信息 ); ta.Introduce(); ta.Study(人工智能); ta.Teach(C#实验课); Console.WriteLine($已获得学分: {ta.GetCredits()}分, 助教时长: {ta.GetTeachingHours()}小时\n); // 多态测试将助教当作学生使用 Console.WriteLine( 多态测试助教作为学生 ); ILearner learner ta; learner.Study(数据库原理); Console.WriteLine($作为学生已获得学分: {learner.GetCredits()}分); // 多态测试将助教当作老师使用 Console.WriteLine(\n 多态测试助教作为老师 ); ITeacher teacher2 ta; teacher2.Teach(数据结构实验); Console.WriteLine($作为老师授课时长: {teacher2.GetTeachingHours()}小时); // 多态测试学生列表 Console.WriteLine(\n 多态测试人员列表 ); IPerson[] people { student, teacher, ta }; foreach (var person in people) { person.Introduce(); } Console.WriteLine(\n按任意键退出...); Console.ReadKey(); } } }