首页 > 编程语言 >C#中接口的实例化

C#中接口的实例化

时间:2023-08-30 09:23:01浏览次数:29  
标签:IAnimal C# 接口 对象 实例 IMyInterface 构造函数

一、接口回调

就是继承中的向上转型。父类 FL=new 子类();只不过这里的父类就是interface接口。(个人认为这里不管是class的override还是interface的重写,都是一样的用法)

可以把实现某一接口类创建的对象的引用赋给该接口声明的接口变量,那么该 接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口 

中的方法时,就是通知相应的对象调用接口方法

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InterfaceTest {
interface IMyInterface {
void AMethod();
}
class Test : IMyInterface {
public void AMethod() {
Console.WriteLine("Extends from IMyInterface in Test1");
}}
class Test2 : IMyInterface {
public void AMethod() {
Console.WriteLine("Extends from IMyInterface in Test2");
}}
class Program {
static void Main(string[] args) {
IMyInterface a = new Test();
IMyInterface b=new Test2();
a.AMethod();
b.AMethod();
Console.ReadKey();
}} }

执行结果如下: 
Extends from IMyInterface in Test1 
Extends from IMyInterface in Test2
接口对象的实例化实际上是一个接口对象作为一个引用 
,指向实现了它方法的那个类中的所有方法,这一点非常象C++中的函数指针(在C#中类似委托),但是却是有 
区别的。C#中的接口对象实例化实际上是一对多的,而C++中的函数指针是一对一的。 
但是需要注意的是,接口对象的实例化必须用实现它的类来实例化,而不能用接口本身实 
例化。用接口本身实例化它自己的对象在C#中是不允许的。

1.如何获取接口interface的所有实现实例对象?

如果我们想一次性将所有实现了某个接口的某个方法的实例全部执行一遍,只能一个对象一个对象的初始化然后调用方法,这样太麻烦了,可以通过动态创建对象并执行对象的方法来实现这个效果

 

通过反射来获取当前项目中的程序集对象列表,并根据程序集对象的类型获取继承或实现了接口的对象列表

//获取实现接口IAnimal的实例对象
var types = AppDomain.CurrentDomain.GetAssemblies()
                        .SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IAnimal))))
                        .ToList(); 

 foreach (Type t in types)
{
    var animal = (IAnimal)Activator.CreateInstance(t)!;
    animal.Cry();
}

 上述方法只能用于包含无参构造函数的类,只包含有参构造函数的类会出错

2.如何判断实例对象的构造函数是否有参数?

  我们可以通过GetConstructors方法来获取对象的构造函数集合,并通过GetParameters方法获取到构造函数的参数集合,判断构造函数的参数集合是否为空即可判断该对象的构造函数是否为有参或无参构造函数。

foreach (Type v in types)
{
    if (v.GetConstructors().Any(x => x.GetParameters().Any()))
    {
        Console.WriteLine($"{v.Name}=>有参构造函数");
    }
    else
    {
        Console.WriteLine($"{v.Name}=>无参构造函数");
    }
}

foreach (Type t in types)
{
    IAnimal animal;
    if (t.GetConstructors().Any(x => x.GetParameters().Any()))
    {
        //有参构造函数
        //动态创建IAnimal的有参构造函数实现实例对象Dog
        animal = (IAnimal)Activator.CreateInstance(t, new object[] { "阿黄" })!;
    }
    else
    {
        //无参构造函数
        //动态创建IAnimal的无参构造函数实现实例对象Cat
        animal = (IAnimal)Activator.CreateInstance(t, new object[] { })!;
    }
    animal.Cry();



标签:IAnimal,C#,接口,对象,实例,IMyInterface,构造函数
From: https://www.cnblogs.com/gujianli/p/17666357.html

相关文章

  • centos 离线安装 mysql5.7
    下载离线安装包tarhttps://dev.mysql.com/downloads/mysql/5.7.html#downloads(mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz)移动到安装目录解压/usr/local/tar-zxvfmysql-5.7.36-linux-glibc2.12-x86_64.tar.gzmv mysql-5.7.36-linux-glibc2.12-x86_64mysql创建用......
  • CTFshow misc11-20
    misc11:没有头绪,看了网上大佬的一些思路,受益匪浅,和大家分享下。1.解压zip文件,用winhex打开misc11.png2.判断文件格式是否篡改,检查png的文件头和文件尾,文件格式正常PNG文件头(hex):89504e470d0a1a0aPNG文件尾(hex):0000000049454E44AE4260823.判断否有文件......
  • C#/ref、out
    ref和out都用于引用传递参数,允许函数修改参数的值。主要区别:-ref参数必须在调用前初始化,out参数不需要初始化但必须在函数内赋值。-使用ref和out时,ref参数调用前和调用后值都可以访问,out参数调用前不能访问值只能赋值。-ref允许参数的值在函数内被修改,out只能在函数内赋初......
  • pg10 安装pageinspect插件
    1.切换到源码包的contrib路径下,ls插件名称cd/data/soft/PostGreSQL/postgresql-10.20/contrib/pageinspect编译该插件makegcc-Wall-Wmissing-prototypes-Wpointer-arith-Wdeclaration-after-statement-Wendif-labels-Wmissing-format-attribute-Wformat-security-fn......
  • Bugku-web39(CBC反转攻击)
    传入cipher::o0Na0VUpA9NNqK5lQTP3chZqec57H%2FAMEkq5YSNE3oDfyc1WXAyLMW8RbiwIX9dyKMF5uwWSEzJVCKxOsDnVcQ%3D%3D传入的vi::L4p%2BUXpwki%2FiUktyYxs7eg%3D%3D<?phpheader("Content-Type:text/html;charset=utf-8");#计算cipher/*明文1:a:2:{s:8:&q......
  • PyTorch多卡分布式训练DDP单机多卡
    前言因为课题组发的卡还没有下来,先向导师问了实验室的两张卡借用。之前都是单卡训练模型,正好在这个机会实践以下单机多卡训练模型的方法。关于DDP网上有很多资料,但都比较零碎(有些博客的代码甚至没办法run),Pytorch给出的官方文档看起来也比较吃力。因此这篇文章的主要目的是......
  • VSCODE 关闭 go 的test缓存
    Ctrl+,进入设置,搜索gotestFlags点击Editinsettings.json在内添加"-count=1"......
  • TienChin 渠道管理-查看渠道接口
    自定义hasPermission校验规则自定义一个SpringSecurityhasPermission校验规则:在tienchin-framework模块当中进行自定义,新建CustomSecurityExpressionRoot.java自定义hasPermission判断逻辑类:/***@authorBNTang*@version1.0*@description自定义hasPerm......
  • java directoryAndfileHide
    javaimportjava.io.File;importjava.util.Scanner;importjava.io.IOException;importjava.nio.file.Files;importjava.nio.file.attribute.DosFileAttributeView;importjava.nio.file.attribute.DosFileAttributes;publicclassDirectoryandFileHIde{pub......
  • CTFSHOW_杂项11
    【隐写工具】【试一试?】jphideseek(JPHS)使用方法,检测提示放进JPHS,无密码seek保存为.txt格式文件头有点像png,将后缀改为.png出现二维码,手机扫码跳转到CTFSHOW登录页面【捂脸】看了眼wp,所以说找个QR解析工具看URL,得到:https://ctf.show/?ZmxhZ3vmiJjnpZ7lvZLmnaXlj5HnjrDoh6rlt......