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

相关推荐
方也_arkling10 小时前
【Java-Day08】static / final / 枚举
java·开发语言
风吹夏回10 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
Chengbei1110 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_11210 小时前
web-第一次课后作业
java·开发语言·idea
小熊Coding10 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋910 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
xiaoshuaishuai811 小时前
C# 内存管理与资源泄漏
开发语言·c#
lsx20240611 小时前
SVN 检出操作
开发语言
basketball61612 小时前
C++ NULL 和 nullptr 区别 以及 nullptr 的核心实现
java·开发语言·c++
旺仔来了12 小时前
不联网的Linux下部署python环境
linux·开发语言·python