C#中接口的實例化
一、接口回調
就是繼承中的向上轉型。父類 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();
}

浙公網安備 33010602011771號