gpt4 book ai didi

c# - 通过引用传递 : child of multiple interfaces

转载 作者:行者123 更新时间:2023-11-30 19:20:44 25 4
gpt4 key购买 nike

将实现多个接口(interface)的对象传递给只需要一个接口(interface)的函数时,我遇到了构建错误。

我正在开发一个通信包。该包有一个 Receiver 类和一个 Sender 类。 Receiver 类使用通知接口(interface) Receive_Notifier(函数对象)来处理通知。同样,Sender 类使用通知接口(interface) Send_Notifier 来处理通知。

interface Send_Notifier
{
void sending_text(string text);
}

interface Receive_Notifier
{
void raw_text_received(string raw_text);
}

class Sender
{
Send_Notifier m_notifier = null;
public Sender(ref Send_Notifier notifier)
{
m_notifier = notifier;
}
public void send(string text)
{
m_notifier.sending_text(text);
return;
}
}

class Receiver
{
Receive_Notifier m_notifier = null;
public Sender(ref Receive_Notifier notifier)
{
m_notifier = notifier;
}
public void receive(string text)
{
m_notifier.raw_text_received(text);
return;
}
}

我已将这些接口(interface)组合成一个 Communications_Notifier:

interface Communications_Notifier
: Send_Notifier, Receive_Notifier
{
}

我创建了一个Notifier 类来实现Communications_Notifier 接口(interface):

class Notifier
: Communications_Notifier
{
public void sending_text(string text)
{
System.Console.WriteLine("--> " + text);
}
public void raw_text_received(string raw_text)
{
System.Console.WriteLine("<-- " + raw_text);
}
}

为了简化这篇文章,我将只显示发件人类:

class Sender
{
Send_Notifier m_notifier = null;
public Sender(ref Send_Notifier notifier)
{
m_notifier = notifier;
}
public void send(string text)
{
m_notifier.sending_text(text);
return;
}
}

问题是当我将 Notifier 的实例传递给 Sender 类的实例时:

class Program
{
static void Main(string[] args)
{
Notifier the_notifier = new Notifier();
Sender talker = new Sender(ref the_notifier); // ** Error generating line

talker.send("Hello\n");

string pause_text;
pause_text = System.Console.ReadLine();
}
}

来自 Visual C# Express 2010 的错误:

Error   1   The best overloaded method match for 'Multiple_Inheritance_Interface.Sender.Sender(ref Multiple_Inheritance_Interface.Send_Notifier)' has some invalid arguments    C:\Users\Thomas\Programming_Experiments\C_Sharp\Multiple_Inheritance_Interface\Multiple_Inheritance_Interface\Program.cs    55  29  Multiple_Inheritance_Interface  
Error 2 Argument '1': cannot convert from 'ref Multiple_Inheritance_Interface.Notifier' to 'ref Multiple_Inheritance_Interface.Send_Notifier' C:\Users\Thomas\Programming_Experiments\C_Sharp\Multiple_Inheritance_Interface\Multiple_Inheritance_Interface\Program.cs 55 44 Multiple_Inheritance_Interface

问题:

  1. 为什么不能 Notifier转换为类型的引用Sender,因为它实现了Sender 接口(interface)?
  2. 为什么论点是构造函数无效?

注意:我正在从 C++、C 和 Java 背景过渡到 C#。

最佳答案

ref 参数不支持协方差或逆方差。这是必要的,因为它既可以读取也可以更改引用。因此,如果您传入一个派生类,并且该函数分配了一个不是该派生类型的新实例,您的代码就会中断。

例子:

void MakeCat(ref Animal animal)
{
animal=new Cat();
}

Dog dog=new Dog();
MakeCat(ref dog);

这显然行不通,因为现在您的 dog 变量中有一个 Cat


我不确定您一开始为什么要使用 ref。使用引用类型,您已经可以更改传入实例的内容。您只是不能用该引用类型的新实例替换传入的变量。


另一方面,

out 参数看起来可能是协变的。我怀疑它们不是由于运行时的限制:它们实际上是标记有属性的 ref 参数,告诉编译器将其视为 out 参数。

关于c# - 通过引用传递 : child of multiple interfaces,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5343936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com