C#-接口(Interface)详解
定义
在 C# 语言中,类之间的继承关系仅支持单重继承,而接口是为了实现多重继承关系设计的。一个类能同时实现多个接口,还能在实现接口的同时再继承其他类,并且接口之间也可以继承。无论是表示类之间的继承还是类实现接口、接口之间的继承,都使用“:”来表示。
接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。
定义接口语法:
interface 接口名称
{
接口成员;
}
接口命名通常以 I 字母开头,例如Itest。
接口成员,不允许使用 public、private、protected、internal 访问修饰符,不允许使用 static、virtual、abstract、sealed 修饰符。不能定义字段,定义的方法不能包含方法体。
示例:定义一本书的接口,有id、名称name、定价price几个属性,和一个方法售卖价SalePrice()。
using System; namespace app
{
interface IBook
{
int Id { get; set; }
string Name { get; set; }
double Price { get; set; }
double SalePrice(int discount);
}
}
实现
接口的实现与类的继承语法格式类似,也是重写了接口中的方法,让其有了具体的实现内容。
实现接口语法:
class 类名 : 接口名
{
//类中的成员以及实现接口中的成员
}
在实现接口的成员时有两种方式,隐式实现接口成员和显式实现接口成员。隐式实现接口成员是将接口的所有成员以 public 访问修饰符修饰。显式实现接口是指在实现接口时所实现的成员名称前含有接口名称作为前缀。
下面对一本书的接口分别使用隐式实现和显式实现。
隐式实现:
隐式实现后进行运行:
class Program
{
static void Main(string[] args)
{
Book book = new Book();
book.Id = 1001;
book.Name = "tynam";
book.Price = 60; Console.WriteLine("id:{0}" , book.Id);
Console.WriteLine("书名:{0}" , book.Name);
Console.WriteLine("定价:{0}", book.Price);
Console.WriteLine("售卖价:{0}", book.SalePrice(8));
}
}
运行后结果:
id:1001
书名:tynam
定价:60
售卖价:48
显式实现:
class Book:IBook
{
public double Price { get; set; }
// 显示的实现接口中的属性
int IBook.Id { get; set; }
string IBook.Name { get; set; } // 显式实现接口中的方法
double IBook.SalePrice(int discount)
{
double salePrice = Price * discount * 0.1;
return salePrice;
} }
显式实现后进行运行:
class Program
{
static void Main(string[] args)
{
Book book = new Book();
IBook bookDetail = book;
bookDetail.Id = 1001;
bookDetail.Name = "tynam";
bookDetail.Price = 60; Console.WriteLine("id:{0}" , bookDetail.Id);
Console.WriteLine("书名:{0}" , bookDetail.Name);
Console.WriteLine("定价:{0}", bookDetail.Price);
Console.WriteLine("售卖价:{0}", bookDetail.SalePrice(8));
}
}
运行后结果:
id:1001
书名:tynam
定价:60
售卖价:48
注意:接口无法直接进行实例化。 其成员由实现接口的任何类或结构来实现。
多态
使用接口实现多态 需要满足以下两个条件。
定义接口并使用类实现了接口中的成员。
创建接口的实例指向不同的实现类对象。
示例:定义一个接口名称为 IBird,分别定义两个实现类 Phoenix 和 Duck 来实现接口的成员,代码如下。
interface IBird
{
void fly();
} class Phoenix : IBird
{
public void fly()
{
Console.WriteLine("凤凰会飞");
}
} class Duck : IBird
{
public void fly()
{
Console.WriteLine("鸭子也会飞");
}
}
实例化后执行:
class Program
{
static void Main(string[] args)
{
IBird phoenix = new Phoenix();
phoenix.fly();
IBird duck = new Duck();
duck.fly();
}
}
执行结果:
凤凰会飞
鸭子也会飞
最新文章
- 【bzoj1688】[USACO2005 Open]Disease Manangement 疾病管理
- 通过JDBC进行简单的增删改查(以MySQL为例)
- [Python] Pitfalls: Be Careful with os.chdir
- Hmmer安装与使用
- 使用GROUP BY统计记录条数 COUNT(*) DISTINCT
- SCU3109 Space flight(最大权闭合子图)
- Altium designer 原理图库快速创建
- wifi链接配置
- ♫【jQuery插件】图片放大镜
- Qt4--加密日记本(子例化QMainWindow文本加密解密)
- MySql 查询表字段数
- matlab和C语言的break及continue测试
- TextView的几个属性
- Jenkins持续集成01—Jenkins服务搭建和部署
- Django+nginx+uwsgi部署教程
- Nginx log日志切割shell
- oracle 字符转换成数字
- LeetCode--021--合并两个有序链表(java)
- 微信支付---公众号支付和H5支付区别
- 剑指offer-矩阵覆盖
热门文章
- 记一次mysql关于limit和orderby的优化
- PHP ftp_ssl_connect() 函数
- 2019 HL SC day1
- 安装ElasticSearch遇到的深坑
- .NET三层架构各项目之间的引用关系及如何添加引用?
- ios 生成字母加数字的随机数
- 5 年 Python 的我,总结了这 90 条写 Python 程序的建议
- XCTF-WEB-高手进阶区-upload1-笔记
- 手写IOC实现过程
- 算法面试题:一个List<;Student>;,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点!