父类Person中Eat为虚方法,子类Bady和Adult对Eat虚方法进行重写,因父类Person有字段name和gender,子类Adult有字段degree,所以要求父类子类定义构造函数。
时间: 2024-12-22 11:27:08 浏览: 7
在 C# 中,当一个基类(如 `Person`)中的方法被声明为 `virtual` 或者 `abstract`,那么这个方法就成为了一个虚方法或抽象方法。如果子类(如 `Bady` 和 `Adult`)选择覆盖这个虚方法,他们可以通过提供自己的实现来改变该行为。
`Eat` 方法作为虚方法意味着 `Bady` 和 `Adult` 可以有自己的版本,根据它们各自的需求和特定的行为。在这个例子中:
1. **虚方法 Eat**:在 `Person` 类中,`Eat` 是一个可能执行通用饮食操作的方法,但在具体的子类中,可以根据个体差异有不同的实现,比如健康饮食、儿童专属食物等。
2. **构造函数**:由于每个子类都有额外的属性(如 `Bady` 的年龄,`Adult` 的学位),为了确保这些属性在创建实例时得到初始化,子类通常会继承并扩展父类的构造函数。例如:
```csharp
public class Person
{
public string Name { get; set; }
public string Gender { get; set; }
// 虚拟 Eat 方法
public virtual void Eat() => Console.WriteLine("This is a generic eat method in Person.");
// 基本构造函数
public Person(string name, string gender)
{
Name = name;
Gender = gender;
}
}
public class Bady : Person
{
public int Age { get; set; }
// 子类构造函数,传递父类所需参数并设置额外的属性
public Bady(string name, string gender, int age) : base(name, gender)
{
Age = age;
}
public override void Eat()
{
Console.WriteLine($"Child {Name} is eating.");
}
}
public class Adult : Person
{
public string Degree { get; set; }
public Adult(string name, string gender, string degree) : base(name, gender)
{
Degree = degree;
}
public override void Eat()
{
Console.WriteLine($"Adult {Name} with degree '{Degree}' is eating.");
}
}
```
阅读全文