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]
添加一个属性类型为添加元素的类型
属性名: this[int 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】,通过索引值的访问方式 访问里面的元素, 以数组索引值访问方式来进行访问 cs[0]访问方式

Console.WriteLine(cs.Id);
Console.WriteLine(cs[0].Name);
Console.WriteLine(cs[1].Name);
Console.WriteLine(cs[2].Name);
Console.WriteLine(cs[3].Name);

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

cs[0]=new Student() { Name="惠义敬",Age=20};//以数组索引值访问方式
Console.WriteLine(cs[0].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 this[int index]//arr[0]
{
get
{
Console.WriteLine("数组索引值的访问方式:arr[0]");
return list[index]; //get获取arr[0]访问方式的值
}
set
{
Console.WriteLine("数组索引值的访问修改的时候:arr[0]=对象");
list[index] = value;//set在设置值的时候触发 arr[0]=对象
}
}

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

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

相关推荐
阿猿收手吧!7 小时前
【C++】string_view:高效字符串处理指南
开发语言·c++
玄同7658 小时前
我的 Trae Skill 实践|使用 UV 工具一键搭建 Python 项目开发环境
开发语言·人工智能·python·langchain·uv·trae·vibe coding
Yorlen_Zhang8 小时前
Python Tkinter Text 控件完全指南:从基础编辑器到富文本应用
开发语言·python·c#
lxl13078 小时前
C++算法(1)双指针
开发语言·c++
不绝1918 小时前
C#进阶:预处理指令/反射,Gettype,Typeof/关键类
开发语言·c#
无小道8 小时前
Qt-qrc机制简单介绍
开发语言·qt
zhooyu8 小时前
C++和OpenGL手搓3D游戏编程(20160207进展和效果)
开发语言·c++·游戏·3d·opengl
HAPPY酷8 小时前
C++ 和 Python 的“容器”对决:从万金油到核武器
开发语言·c++·python
大鹏说大话8 小时前
告别 MSBuild 脚本混乱:用 C# 和 Nuke 构建清晰、可维护的现代化构建系统
开发语言·c#
Mr_sun.9 小时前
Day09——入退管理-入住-2
android·java·开发语言