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

相关推荐
你不是我我2 小时前
【Java 开发日记】HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·开发语言·微服务
tjl521314_212 小时前
04C++ 名称空间(Namespace)
开发语言·c++
赏金术士3 小时前
Kotlin 数据流与单双向绑定
android·开发语言·kotlin
逻辑驱动的ken3 小时前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ6 小时前
通过java后端代码来实现给word内容补充格式文本内容控件,以及 设置控件的标记和标题
java·c#·word
無限進步D6 小时前
Java 面向对象高级 接口
java·开发语言
两年半的个人练习生^_^7 小时前
Java日志框架和使用、日志记录规范
java·开发语言·开发规范
杨凯凡8 小时前
【032】排查入门:jstack、heap dump、Arthas 初识
java·开发语言·后端
其实防守也摸鱼8 小时前
无线网络安全--实验 规避WLAN验证之发现隐藏的SSID
java·开发语言·网络·安全·web安全·智能路由器·无线网络安全