c#子类如何覆写父类抽象函数
时间: 2024-11-14 21:13:40 浏览: 19
在C#中,子类覆写父类的抽象函数主要是为了提供具体的实现。抽象函数是在基类中声明为抽象的,它没有实际的实现,而是由派生类通过override关键字来实现的。以下是步骤:
1. 首先,在父类中声明一个抽象函数。这通常需要在函数前加上`abstract`关键字,并且可能包含一个`void`返回类型、参数列表以及访问修饰符(如`public`, `protected`等)。
```csharp
public abstract class ParentClass
{
public abstract void AbstractMethod();
}
```
2. 然后,在子类中,找到想要覆写的抽象函数,使用`override`关键字并提供具体的实现。
```csharp
public class DerivedClass : ParentClass
{
public override void AbstractMethod()
{
// 子类的具体实现
Console.WriteLine("这是DerivedClass的AbstractMethod实现");
}
}
```
相关问题
覆写父类非抽象函数需要加override吗
在C#中,覆写(也称为重写)父类的非抽象函数并不强制要求使用`override`关键字。非抽象函数意味着它们已经有了默认的实现,子类可以选择是否覆盖这个方法。如果子类想要替换其父类中相同名称和参数列表的非虚方法(即不需要改变的行为),则不需要显式地使用`override`,直接编写新的实现即可。
例如:
```csharp
class BaseClass
{
public void ConcreteMethod()
{
Console.WriteLine("这是BaseClass的ConcreteMethod");
}
}
class DerivedClass : BaseClass
{
// 因为BaseClass的ConcreteMethod不是抽象的,所以无需override
public new void ConcreteMethod()
{
Console.WriteLine("这是DerivedClass的ConcreteMethod覆盖");
}
}
```
这里,`new`关键字用于防止意外地覆盖父类的方法,因为它明确地告诉编译器这是一个全新的实例方法。
根据对面向对象程序设计思想的理解和对C#语法的掌握,自定义几个相关类,并实现类的继承、多态和封装特性,要求子类能够覆写基类的成员方法。写出完整代码
在C#中,我们可以创建一些基础的类,展示继承、多态和封装。这里我会定义一个动物(Animal)基类,然后创建猫(Cat)、狗(Dog)这两个子类,它们都继承自Animal,并覆盖基类的方法。
```csharp
// 定义基类 Animal
public abstract class Animal
{
// 封装属性:姓名
public string Name { get; set; }
// 抽象方法,表示动物叫声
public abstract string Speak();
// 构造函数,初始化姓名
public Animal(string name)
{
Name = name;
}
// 展现封装,隐藏实际的吃食物方法
public virtual void Eat() => Console.WriteLine($"{Name}正在吃饭...");
// 虚方法,让子类可以重写
public virtual void Sleep() => Console.WriteLine($"{Name}正在睡觉...");
}
// 子类 Cat,继承自 Animal 并覆写 Speak 方法
public class Cat : Animal
{
public override string Speak() => "喵~";
// 覆写 Eat 方法,添加猫特有的行为
public override void Eat() => Console.WriteLine($"{Name}在优雅地享用鱼...");
}
// 子类 Dog,继承自 Animal 并覆写 Speak 方法
public class Dog : Animal
{
public override string Speak() => "汪~";
// 覆写 Eat 方法,添加狗特有的行为
public override void Eat() => Console.WriteLine($"{Name}在狼吞虎咽地吃骨头...");
}
// 主程序测试
class Program
{
static void Main(string[] args)
{
// 创建实例并调用各自的方法
var cat = new Cat("花花");
cat.Speak(); // 输出 "喵~"
cat.Eat(); // 输出 "花花在优雅地享用鱼..."
var dog = new Dog("旺财");
dog.Speak(); // 输出 "汪~"
dog.Eat(); // 输出 "旺财在狼吞虎咽地吃骨头..."
// 展示多态,通过基类引用调用子类方法
Animal animal = cat;
animal.Speak(); // 输出 "喵~"
animal = dog;
animal.Speak(); // 输出 "汪~"
}
}
```
在这个例子中,我们展示了:
1. **继承**:Cat和Dog类继承了Animal类。
2. **多态**:`animal.Speak()`可以根据animal的实际类型(Cat或Dog)调用相应的Speak方法。
3. **封装**:通过虚方法Eat和Speak,以及数据属性Name,保护了类内部的数据结构。
阅读全文