首页 > 编程语言 >关于C#接口的用法详细解答,附上案例说明!

关于C#接口的用法详细解答,附上案例说明!

时间:2023-12-13 09:11:57浏览次数:27  
标签:附上 C# double void 接口 实现 logger public

接口

C#中的接口是一种定义了一组方法、属性和事件的类型。它只包含成员的声明,而不包含任何实现。接口可以被类通过实现的方式使用,从而使类能够具有接口定义的行为。

接口在C#中被定义为使用interface关键字,接口的成员默认是公共的。类通过使用implements关键字实现接口,并提供接口中定义的所有成员的具体实现。

接口的优点

  1. 实现多态性:接口允许一个类实现多个接口,从而实现多重继承。这使得类可以具有多个不同类型的行为,提供了更大的灵活性。

  2. 促进代码复用:通过实现接口,可以将常用的功能和行为封装成一个接口,然后多个类可以共享该接口的实现。这样可以减少代码的重复性,提高开发效率。

  3. 支持接口的集合和泛型:接口可以用于定义集合类型,从而可以通过接口对集合进行统一的操作和访问。此外,接口也可以与泛型结合使用,以进一步提高代码的灵活性和可重用性。

  4. 隔离和解耦:接口的使用可以将程序的各个组件解耦,并提供了一种隔离实现细节的方式。通过面向接口的编程,可以使得组件之间的耦合度更低,以便更容易进行单元测试和维护。

接口的缺点与局限性

  1. 不支持字段:接口不能包含字段,只能包含方法、属性和事件的声明。这意味着接口无法定义实例字段,而只能通过实现接口的类来定义字段。

  2. 需要手动实现:类实现接口时,必须手动实现接口中声明的所有成员,包括方法、属性和事件。这需要一定的工作量,特别是在实现多个接口时。

  3. 限制了成员的可访问性:接口中的成员默认为公共的,无法指定其他的访问修饰符(如private、protected等),这可能会影响到一些需要限制访问的情况。

  4. 可能导致多个类实现类似的代码:当多个类实现相同的接口时,它们可能会具有类似的代码实现。这可能会导致一些冗余的代码。

综上所述,接口在C#中是一种强大且常用的工具,它提供了多态性、代码共享和解耦等优点。然而,接口也有一些限制和缺点需要考虑。在使用接口时,需要权衡其优缺点,并根据具体的情况进行选择。

接口的案例

// 定义一个简单的接口
public interface ILogger
{
   void Log(string message);
}

// 实现接口的类
public class ConsoleLogger : ILogger
{
   public void Log(string message)
  {
       Console.WriteLine(message);
  }
}

// 使用接口的类
public class MyClass
{
   private readonly ILogger logger;

   public MyClass(ILogger logger)
  {
       this.logger = logger;
  }

   public void DoSomething()
  {
       // 使用接口中定义的方法
       logger.Log("Doing something...");
  }
}

// 使用
class Program
{
   static void Main(string[] args)
  {
       ILogger logger = new ConsoleLogger();
       MyClass obj = new MyClass(logger);
       obj.DoSomething();
  }
}

 

接口案例2

public interface IShape
{
   // 方法
   double CalculateArea();

   // 属性
   double Perimeter { get; }

   // 事件
   event EventHandler ShapeChanged;
}

public class Circle : IShape
{
   private double radius;

   // 实现接口中的方法
   public double CalculateArea()
  {
       return Math.PI * radius * radius;
  }

   // 实现接口中的属性
   public double Perimeter
  {
       get { return 2 * Math.PI * radius; }
  }

   // 实现接口中的事件
   public event EventHandler ShapeChanged;

   public double Radius
  {
       get { return radius; }
       set
      {
           radius = value;
           OnShapeChanged();
      }
  }

   protected virtual void OnShapeChanged()
  {
       ShapeChanged?.Invoke(this, EventArgs.Empty);
  }
}

public class Program
{
   static void Main(string[] args)
  {
       Circle circle = new Circle();
       circle.Radius = 5;

       Console.WriteLine("Area: " + circle.CalculateArea());
       Console.WriteLine("Perimeter: " + circle.Perimeter);
  }
}
 

 

标签:附上,C#,double,void,接口,实现,logger,public
From: https://www.cnblogs.com/chen233/p/17898277.html

相关文章

  • [CF839E] Mother of Dragons
    最优方案一定是选择一个团,并在团里平均分配点权。实际上,定义一个点\(u\)的权重\(w_u\)为\(\sum\limits_{(u,v)}s_v\),那么如果方案中\(w_x>w_y\),将\(y\)去掉并将其点权加在\(x\)上一定更优,所以答案一定会被调整成一个团。对于求最大团,只需要meetinthemiddle加上......
  • C# 从代码入门 Mysql 数据库事务
    目录生成数据库数据Mysql数据库事务基础数据库的并发一致性问题数据库事务的隔离级别BeginTransaction()和TransactionScope的区别BeginTransaction()可以不手动撤销TransactionScope总结DML是否可以使用事务顺序多操作嵌套事务事务范围封装DbContextTransactionScopeBeginT......
  • 向量数据库 及 LangChain 用法
    当今科技领域的发展日新月异,向量数据库成为了热门的话题之一。这些数据库以其高效的向量检索和相似度搜索功能,为各种应用场景提供了强大的支持。本文旨在汇总向量数据库Milvus、Zilliz、Faiss、Qdrant、LlamaIndex、Chroma、LanceDB、Pinecone、Weaviate、 基本介绍1.Milv......
  • [ARC141C] Bracket and Permutation
    考虑假设已知括号序列\(s\),如何求出\(p,q\)。对于求\(p\),考虑从\(s_1\)到\(s_n\)逐个往里放,如果能放就直接放,肯定不劣,否则就从后面抽最近的左括号放过来,然后继续放。不难证明不存在更优方案,对于\(q\)同理。接下来我们发现,如果\(p\)中存在\(p_i<p_{i-1}\),\(s_{p_{i......
  • 【Centos】Centos 7.6 安装 XXL-JOB
    1  前言前面我们安装了JDK以及MySQL哈,我们继续安装XXL-JOB,官网详细教程。https://www.xuxueli.com/xxl-job/https://www.xuxueli.com/xxl-job/#1.5%20%E4%B8%8B%E8%BD%BD2 安装步骤2.1 下载源码https://gitee.com/xuxueli0323/xxl-job2.2 数据库初始化不需......
  • C++ Qt开发:RadioButton单选框分组组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QRadioButton单选框组件以及与之交互的QButtonGroup类的常用方法及灵活运用。QRadioButton是Qt框......
  • 轮询操作select和poll
    select和poll系统调用最终会使设备驱动中的poll()函数被执行,Linux2.5.45内核还引入和epoll()即extendedpoll。intselect(intnumfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout)其中readfds、writefds、exceptfds分别是select()监视的读、......
  • JavawebDay2JavaScript
      1.脚本:不用经过编译2.与Java语言完全不同但是基础语法类似一:js引入方式   第一种:   第二种  1*alert:当进入文档时会跳出一个警告框。suchas:二:js基础语法    1书写语法   2输出语句window.可以省略三:基础语法1变量   var特点:a:......
  • DC-8靶场
    准备:目标:获得root权限攻击虚拟机:kali  DC-8靶场:DC:8~VulnHub 虚拟机:IP地址 192.168.88.130 靶场IP地址:192.168.88.129 第一步:信息收集通过arp-scan-l查看本网段的虚拟机也可以通过nmap或者 netdiscover-r192.168.88.0/24netdiscover-r192.168.88......
  • CF1900D Small GCD
    Link这是一个需要欧拉反演的题目首先,可以知道只和数字之间的大小有关,数列的顺序无关,那么就可以首先排一个序方便解决该问题。根据欧拉函数的性质,知道\(n=\sum_{d|n}\phi{(n)}\)那么我们每次先确定中间的数\(a_j\),然后根据公式,得他它得贡献是\(\sum_{i=1}^{j-1}gcd(a_{i},a_{j}......