gpt4 book ai didi

c#接口(interface)实现错误

转载 作者:太空宇宙 更新时间:2023-11-03 18:03:52 25 4
gpt4 key购买 nike

我正在为我的应用程序开发通信管理器,其设计如下:

ICommunicator接口(interface),一个通用的通信器。

public interface ICommunicator
{
bool openConnection();
bool closeConnection();

bool isConnectionOpen();
Form getConfigurationForm();

void Data_Input(object sender, EventArgs e);
}

目前,一个具体的通信器是 SerialCommunicator:

public class SerialCommunicator : ICommunicator
{
public delegate bool setPortDelegate(string portName);
public delegate bool setBaudRateDelegate(int baudRate);

private SerialPort serial;

public SerialCommunicator()
{
serial = new SerialPort();
loadDefaultSerialPreset(serial);
serial.DataReceived += Data_Input;
}

public bool openConnection()
{
if (serial.IsOpen)
{
return false;
}
try
{
serial.Open();
}
catch (Exception)
{
//could not open the port
return false;
}

return serial.IsOpen;
}

public bool closeConnection()
{
try
{
serial.Close();
}
catch (Exception)
{
return false;
}
return !serial.IsOpen;
}

public bool isConnectionOpen()
{
return this.serial.IsOpen;
}

public bool sendData(String text)
{
if (!this.serial.IsOpen)
{ return false; }

return true;
}

public void Data_Input(object sender, SerialDataReceivedEventArgs e)
{
String s = serial.ReadLine();
//tbd
}

public Form getConfigurationForm()
{
return new portConf(setPortName, setBaudRate);
}

private bool setPortName(string portName)
{
if (portName == null || portName.Length < 1 || !portName.StartsWith("COM"))
{
return false;
}
if (serial.IsOpen)
{
return false;
}
serial.PortName = portName;
return true;
}

private bool setBaudRate(int baudRate)
{
if (baudRate < 9600 || baudRate > 115200)
{
return false;
}
if (serial.IsOpen)
{
return false;
}
serial.BaudRate = baudRate;
return true;
}

private void loadDefaultSerialPreset(SerialPort s)
{
//default preset
s.BaudRate = 115200;
s.PortName = "COM1";
//default settings
s.DataBits = 8;
s.DiscardNull = false;
s.DtrEnable = false;
s.Handshake = Handshake.None;
s.Parity = Parity.None;
s.ParityReplace = 63;
s.ReadBufferSize = 4096;
s.ReadTimeout = -1;
s.ReceivedBytesThreshold = 1;
s.RtsEnable = false;
s.StopBits = StopBits.One;
s.WriteBufferSize = 2048;
s.WriteTimeout = -1;
}
}

问题是,编译器说 SerialCommunicator 没有实现接口(interface):

'SerialCommunicator' does not implement interface member 'ICommunicator.Data_Input(object, EventArgs)'

我不明白为什么它会给我那个错误。我确实有 Data_Input(object, SerialDataReceivedEventArgs) ,尽管每个 SerialDataReceivedEventArgs 也是一个 EventArgs 对象。

为什么编译器给我这个问题,我该如何解决(我确实需要那个事件来进行其他类型的通信)

最佳答案

还有这些:

//Interface
void Data_Input(object sender, EventArgs e);
// Derived class
public void Data_Input(object sender, SerialDataReceivedEventArgs e)

不是一回事——它们是两种不同的类型。实现接口(interface)时,签名必须与接口(interface)中的签名相同。

您应该将派生更改为完全接口(interface)使用通用参数+约束。

//Interface
public interface ICommunicator<TEventArgs>
where TEventArgs : EventArgs
{
void Data_Input(object sender, TEventArgs e);
}

//Derived
public class SerialCommunicator : ICommunicator<SerialDataReceivedEventArgs>
{
public void Data_Input(object sender, SerialDataReceivedEventArgs e)
{
throw new NotImplementedException();
}
}

即使您不在此处使用泛型,请记住,虽然该方法将有一个 EventArgs 参数,但您当然可以将派生类型传递给它。

关于c#接口(interface)实现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40342105/

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