C#接口与抽象类:关键区别详解

第十五次

一,接口

1,接口: 使用interface关键字定义,接口里面是没有实现的,只是定义了类的一些规则 ,继承于接口的子类必须实现规则,接口可以实现多继承, 类可以继承多个接口,使用逗号隔开

2,接口和抽象类的区别

【1】,相同点: 都不能实例化,都可以让派生类的对象赋值给抽象类或者接口类型变量都必须要在子类实现

【2】,不同点:
* 1,抽象类可以包含普通方法和成员 也可以包含抽象成员和方法, 接口只能由未实行的成员和方法
* 2,接口可以多继承, 抽象类还是和普通类一样的继承
* 3,抽象类在子类通过override实现 接口直接使用即可
* 4,抽象类可以添加修饰符, 接口里面不能添加修饰符
* 5,抽象类里可以定义字段 接口里面不能定义字段 例如 int age

3,相关案例:

【1】,抽象类里面可以定义普通方法

定义A1抽象类:

abstract class A1
{
public int Age { get; set; } = 10;//抽象类里面可以定义普通方法
public void Eat()//抽象类里面可以定义普通方法
{

}

}

【2】,接口: 接口的名称一般以I开头

接口里面的成员不能赋初始值,默认是public类型也不能添加public类型

定义接口方法的时候不能实现

定义接口:

public interface IPeople
{
int Age{ get; set; }//接口里面的成员不能赋初始值,默认是public类型也不能添加public类型
string Name { get; set; }
void Eat();//定义接口方法的时候不能实现

}

【3】,类继承于接口:必须实现接口成员

实现继承:

class Student : IPeople
{
public int Age { get; set; }
public string Name { get; set; }
public void Eat()
{
Console.WriteLine("eat");
}
}
class SmallStudent : IPeople
{
public int Age { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public string Name { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

public void Eat()
{
throw new NotImplementedException();
}
}

【4】,

//A接口
public interface IA
{
double Money { get; set; }
}
public class B
{
public long ShenGao { get; set; }
}
public class C : B
{
public long TiZhong { get; set; }
}
//可以让一个类同时继承于类和其他接口 必须保证类写在前面
//D类继承与C 继承于接口A

class D : C, IA
{
public double Money { get; set; } = 1000;

}

}

二,接口的多继承具体看相关案例:

三,索引器

1,一般情况下,对象的属性;可以使用对象.属性访问, 也可以类名.属性进行访问

2,索引的作用:允许对象可以像数组一样通过对象索引进行访问

3,索引器属性

数组对象3
添加一个属性类型为添加元素的类型
属性名: thisint index;

4,下面根据相关代码进行详细分析:

【1】,创建ClassRoom对象

ClassRoom cs = new ClassRoom() { Id=67,Name = "机器视觉"};
cs.Add(new Student() { Name = "张三", Age = 19 });
cs.Add(new Student() { Name = "不吃香菜", Age = 19 });
cs.Add(new Student() { Name = "猪猪小野", Age = 19 });
cs.Add(new Student() { Name = "东北雨姐", Age = 19 });

【2】,通过索引值的访问方式 访问里面的元素, 以数组索引值访问方式来进行访问 cs0访问方式

Console.WriteLine(cs.Id);
Console.WriteLine(cs0.Name);
Console.WriteLine(cs1.Name);
Console.WriteLine(cs2.Name);
Console.WriteLine(cs3.Name);

【3】,修改room对象添加的元素

cs0=new Student() { Name="惠义敬",Age=20};//以数组索引值访问方式
Console.WriteLine(cs0.Name);

【4】,验证使用arr"字符串"方式访问元素

cs"猪猪小野" = new Student() { Name = "余伟", Age = 18 }; //arr""进行修改
Console.WriteLine(cs"余伟".Name);//arr""进行获取

Console.ReadKey();
}

}

【5】,创建一个学生类

public class Student
{
public string Name { get; set; }
public int Age { get; set; }

}

【6】,班级类: 封装成一个具备添加学生成员的类

public class ClassRoom
{
public int Id { get; set; }//班级的编号
public string Name { get; set; }//班级的名称
public List<Student> list = new List<Student>();//存放添加的学生
//添加学生对象
//Add(添加张三对象)
public void Add(Student a)
{
list.Add(a);

}

【7】,添加一个属性类型为添加元素的类型 也就是38行添加的元素类型

public Student thisint index//arr0
{
get
{
Console.WriteLine("数组索引值的访问方式:arr0");
return listindex; //get获取arr0访问方式的值
}
set
{
Console.WriteLine("数组索引值的访问修改的时候:arr0=对象");
listindex = value;//set在设置值的时候触发 arr0=对象
}
}

【8】,重载索引器 索引器是字符串类型, 以后访问的时候可以通过

arr"张三" 找到名字为张三的对象

相关推荐
微学AI3 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
豆瓣鸡4 小时前
算法日记 - Day3
java·开发语言·算法
凯丨4 小时前
AI 蠕虫来了:恶意文档如何通过 Copilot for Word 自我传播?
人工智能·c#·copilot
韭菜炒鸡肝天4 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
Aaron - Wistron5 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
Dxy12393102166 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
0566466 小时前
Python康复训练——常用标准库
开发语言·python·学习
骊城英雄7 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
吾儿良辰7 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#
哎呦喂我去去去7 小时前
C#实现屏幕墙:同时监控多个电脑桌面(支持Windows、信创Linux、银河麒麟、统信UOS)
linux·windows·c#