首页 > 编程语言 >C# 普通类、抽象类、普通方法、抽象方法、虚方法、重写方法、接口

C# 普通类、抽象类、普通方法、抽象方法、虚方法、重写方法、接口

时间:2024-10-29 15:09:16浏览次数:5  
标签:C# 方法 void 实现 派生类 抽象类 重写 public

C# 面向对象编程概念总结

本文总结了 C# 中的几个重要面向对象编程概念,包括普通类、抽象类、普通方法、抽象方法、虚方法、重写方法、接口等,帮助更好地理解它们的适用场景及用法。

1. 普通类(Class)

普通类是 C# 中最基础的类,用于创建对象和定义对象的属性、方法。普通类可以被实例化(使用 new 关键字),包含成员变量、方法、构造函数等,适用于描述具体的实体。

示例代码

public class Animal
{
    public string Name { get; set; }

    public void Speak()
    {
        Console.WriteLine($"{Name} is speaking.");
    }
}

使用场景:适用于描述具体对象的特性和行为。例如,定义 Animal 类,描述动物的名称、行为。

2. 抽象类(Abstract Class)

抽象类是一个不能直接实例化的类,通常用于定义一组通用属性和方法(包括抽象方法和虚方法),并在派生类中具体实现。抽象类可以包含已实现的方法和未实现的抽象方法。

示例代码

public abstract class Shape
{
    public string Color { get; set; }
    public abstract double CalculateArea();
}

使用场景:适用于定义通用特征和行为,供不同派生类实现。例如,Shape 类作为所有形状的抽象类,不同形状(如圆形、矩形)具体实现面积计算。

3. 普通方法(Regular Method)

普通方法是类中默认的非虚方法,可以直接被调用,且在派生类中无需重写。普通方法在编译时被确定,不支持多态。
示例代码

public class Car
{
    public void StartEngine()
    {
        Console.WriteLine("Engine started.");
    }
}

使用场景:适用于不需要在派生类中重写的方法,实现类的基础功能。

4. 抽象方法(Abstract Method)

抽象方法只能在抽象类中声明,且没有方法体(实现)。派生类必须重写抽象方法以实现具体功能。抽象方法定义的行为需在不同派生类中有不同实现。

public abstract class Animal
{
    public abstract void MakeSound();
}

public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}

使用场景:适用于描述必须在派生类中实现的功能。例如 MakeSound 方法,要求不同动物有不同的叫声。

5.虚方法(Virtual Method)

虚方法是一种可被重写的方法,它有默认的实现,但允许派生类选择性地重写它。虚方法允许实现多态(polymorphism)。

public class Animal
{
    public virtual void Move()
    {
        Console.WriteLine("The animal moves.");
    }
}

public class Bird : Animal
{
    public override void Move()
    {
        Console.WriteLine("The bird flies.");
    }
}

使用场景:适用于希望在派生类中重写,但不强制要求重写的方法。

6.重写方法(Override Method)

重写方法用于在派生类中对基类虚方法或抽象方法进行重写,以实现具体行为。重写方法需要用 override 关键字,并且方法签名需与基类一致。

public class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Meow");
    }
}

使用场景:适用于在派生类中提供基类方法的具体实现。

7. 接口(Interface)

接口定义了一组方法和属性的规范,但不包含实现。类可以实现一个或多个接口(多继承),从而保证实现接口所定义的所有成员。接口可以被实现类在任意层级实现,打破了类的单一继承限制。

public interface IFlyable
{
    void Fly();
}

public class Bird : IFlyable
{
    public void Fly()
    {
        Console.WriteLine("Bird is flying.");
    }
}

使用场景:适用于定义行为契约,实现解耦和灵活性。例如,IFlyable 接口用于所有可以飞的类,实现飞行功能。

概念 是否可实例化 是否可继承 是否必须重写 是否有方法实现 是否多继承
普通类(Class)
抽象类(Abstract Class) 抽象方法必须重写 是,部分实现
接口(Interface) 否,需实现

标签:C#,方法,void,实现,派生类,抽象类,重写,public
From: https://www.cnblogs.com/smileher/p/18513362

相关文章

  • 1 数值方法A 续
    1数值方法A续下一步是用中心差分法近似\(\frac{dT}{dx}\)。首先,对温度函数\(T(x)\)用泰勒展开,其中由于2阶以上项计算复杂、对结果影响小,故忽略。假设在节点之间温度线性变化。\[T(x)=T(x_i)+(x-x_i)\frac{dT}{dx}|_{x_i}+\frac{(x-x_i)^2}2\frac{d^2T}{dT^2}|_{x_i}\]\[T(x......
  • Shooter Game User Interface Starter
    射击游戏用户界面工具包这个工具包为射击游戏开发者提供了一套完整的UnityUI布局屏幕和预制件,旨在加速游戏界面的开发过程。以下是工具包的核心特性:屏幕布局:包含9个完整的UnityUI布局屏幕,覆盖装备、选项、游戏模式、大厅、社交、装备详情、登录、设置等多个游戏界面。......
  • 1-1.2 数值方法B 续
    1-1.2数值方法B续求解非线性方程一般地,对一个方程求解,就是令\(f(x)=0\)。那么,解方程就意味着找到方程的根(root)。有很多求解非线性方程的方法,它们一般有两种分类;区间法/夹逼法:选择一个区间,该区间的两端函数值的符号相反,然后逐步缩小区间以逼近根。这种方法总能收敛,但收敛速......
  • 1-1 数值方法B
    1-1数值方法B非稳态扩散方程主体公式\[\frac{\partial(\rhoc_pT)}{\partialt}=\frac{\partial}{\partialx}\Big(\lambda\frac{\partialT}{\partialx}\Big)+S(x,t,T)\]该式左边为时间导数,表示某一点的能量随时间的变化;右边为空间变化,描述热在空间扩散的过程。其边界条......
  • PlayWright.Net EvaluateAsync定位选择所以子元素
    playwright=awaitPlaywright.CreateAsync();varuserDataDir=$"{Directory.GetCurrentDirectory()}\\UserData";varcontext=awaitplaywright.Chromium.LaunchPersistentContextAsync(userDataDir,newBrowserTy......
  • centos7部署libreoffice7.5
    安装包下载地址:https://downloadarchive.documentfoundation.org/libreoffice/old/7.5.0.1/rpm/x86_64/ 分别是LibreOffice_7.5.0.1_Linux_x86-64_rpm.tar.gz#libreoffice安装包LibreOffice_7.5.0.1_Linux_x86-64_rpm_langpack_zh-CN.tar.gz#中文包Lib......
  • CTF杂项——[BJDCTF 2020]藏藏藏
    解压附件得到一张图片binwalk  发现有一个压缩包foremost分离 得到一个文件得到二维码扫一扫 得到flag......
  • 【langchain4j接入springboot项目】想学AI平台接入?langchain4j,是不二的选择
    一、项目结构二、示例代码1.Calulator.javapackageorg.ivy.aiservice.func;importdev.langchain4j.agent.tool.Tool;importorg.springframework.stereotype.Component;@ComponentpublicclassCalculator{@Tool("Calculatesthelengthofastring")......
  • c语言-数组队列-学习笔记
    数组队列#include<stdio.h>#include<stdlib.h>/*数组顺序队列*/typedefstructSqQueue{ intdata[10]; intfront; intrear;}SqQueue;voidInitQueue(SqQueue*Q){ Q->front=Q->rear=0;}voidEnQueue(SqQueue*Q,inta){ Q->data[Q->rear......
  • leetcode-3211. 生成不含相邻零的二进制字符串
    leetcode-3211.生成不含相邻零的二进制字符串给你一个正整数n。如果一个二进制字符串x的所有长度为2的子字符串中包含至少一个"1",则称x是一个有效字符串。返回所有长度为n的有效字符串,可以以任意顺序排列。思路:所有长度为2的子字符串都包含1,也就是说,......