Person类中有属性:姓名、年龄;有方法:Eat(),该方法为虚方法(virtual),其功能为输出“我正在吃...”,方法Speak(),该方法输出相应的姓名和年龄; (2)Adult类、Baby类是Person类的派生类,在Adult类中重写Eat()方法,其功能为输出“我正在吃饭”,在Baby类中重写Eat()方法,其功能为输出“我正在喝奶”;
时间: 2024-03-15 22:47:17 浏览: 54
好的,以下是符合您要求代码实现:
```csharp
using System;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public virtual void Eat()
{
Console.WriteLine("我正在吃...");
}
public void Speak()
{
Console.WriteLine("我的名字是{0},我今年{1}岁了。", Name, Age);
}
}
public class Adult : Person
{
public override void Eat()
{
Console.WriteLine("我正在吃饭");
}
}
public class Baby : Person
{
public override void Eat()
{
Console.WriteLine("我正在喝奶");
}
}
```
在这个例子中,我们定义了一个基类 `Person`,并在其中定义了属性 `Name` 和 `Age`,以及虚方法 `Eat()` 和非虚方法 `Speak()`。然后,我们创建了两个派生类 `Adult` 和 `Baby`,并在其中分别重写了 `Eat()` 方法,以实现不同的输出。
相关问题
父类Person中Eat为虚方法,子类Bady和Adult对Eat虚方法进行重写,因父类Person有字段name和gender,子类Adult有字段degree,所以要求父类子类定义构造函数。
在 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.");
}
}
```
请用代码解释一下类的封装,继承和多态
类的封装:
封装是面向对象编程中的一个重要概念,它指的是将数据和行为封装在一个单独的实体中,以保护数据不被外部直接访问和修改。在 C++ 中,可以使用访问修饰符(public、private、protected)来控制类的成员的访问权限,从而实现封装。
例如,下面是一个简单的类的定义,其中包含了一个私有成员变量和一个公有成员函数:
```
class Person {
private:
int age;
public:
void setAge(int a) {
age = a;
}
int getAge() {
return age;
}
};
```
在这个例子中,age 是一个私有成员变量,只能通过公有成员函数 setAge 和 getAge 来访问和修改。这样就可以保护 age 的数据安全性。
继承:
继承是面向对象编程中的另一个重要概念,它指的是一个类可以从另一个类中继承属性和方法。在 C++ 中,可以使用关键字 public、protected、private 来指定继承的访问权限。
例如,下面是一个简单的继承示例:
```
class Animal {
public:
void eat() {
cout << "Animal is eating" << endl;
}
};
class Dog : public Animal {
public:
void bark() {
cout << "Dog is barking" << endl;
}
};
```
在这个例子中,Dog 类继承了 Animal 类的 eat() 方法,并且新增了一个 bark() 方法。这样,Dog 类就可以使用 Animal 类的 eat() 方法,同时也可以新增自己的方法。
多态:
多态是面向对象编程中的另一个重要概念,它指的是同一个方法可以在不同的对象上产生不同的行为。在 C++ 中,可以通过虚函数和纯虚函数来实现多态。
例如,下面是一个简单的多态示例:
```
class Shape {
public:
virtual void draw() {
cout << "Shape is drawing" << endl;
}
};
class Circle : public Shape {
public:
void draw() {
cout << "Circle is drawing" << endl;
}
};
class Rectangle : public Shape {
public:
void draw() {
cout << "Rectangle is drawing" << endl;
}
};
```
在这个例子中,Shape 类定义了一个虚函数 draw(),Circle 类和 Rectangle 类分别重写了这个虚函数。当调用 draw() 方法时,会根据对象的实际类型来决定调用哪个版本的 draw() 方法,从而实现多态。
阅读全文