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["张三"] 找到名字为张三的对象

相关推荐
virus59456 小时前
悟空CRM mybatis-3.5.3-mapper.dtd错误解决方案
java·开发语言·mybatis
初次见面我叫泰隆6 小时前
Qt——3、常用控件
开发语言·qt·客户端
无小道7 小时前
Qt——QWidget
开发语言·qt
时艰.7 小时前
Java 并发编程之 CAS 与 Atomic 原子操作类
java·开发语言
梵刹古音8 小时前
【C语言】 函数基础与定义
c语言·开发语言·算法
梵刹古音8 小时前
【C语言】 结构化编程与选择结构
c语言·开发语言·嵌入式
Yvonne爱编码8 小时前
JAVA数据结构 DAY3-List接口
java·开发语言·windows·python
一方_self8 小时前
了解和使用python的click命令行cli工具
开发语言·python
南宫码农8 小时前
我的电视 - Android原生电视直播软件 完整使用教程
android·开发语言·windows·电视盒子
CoderCodingNo9 小时前
【GESP】C++四级/五级练习题 luogu-P1223 排队接水
开发语言·c++·算法