我正在为我的应用开发一个通讯管理器,其设计如下:
ICommunicator界面,一般的沟通者。
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没有实现接口:
&#39; SerialCommunicator&#39;没有实现接口成员&ICOMmunicator.Data_Input(object,EventArgs)&#39;
我无法理解为什么它会给我这个错误。我确实拥有Data_Input(object, SerialDataReceivedEventArgs)
,但每个SerialDataReceivedEventArgs
也是EventArgs
个对象。
为什么编译器会给我这个问题,如何解决它(我确实需要该事件用于其他类型的通信)
答案 0 :(得分:5)
这些也是:
//Interface
void Data_Input(object sender, EventArgs e);
// Derived class
public void Data_Input(object sender, SerialDataReceivedEventArgs e)
不是一回事 - 它们是两种不同的类型。实现接口时,签名必须与接口中的签名相同。
您应该将派生更改为完全,如界面或使用通用参数+约束。
//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
参数,但您当然可以将派生类型传递给它。
答案 1 :(得分:2)
我无法理解为什么它会给我这个错误。我确实有Data_Input(object,SerialDataReceivedEventArgs),尽管每个SerialDataReceivedEventArgs也是一个EventArgs对象。
虽然SerialDataReceivedEventArgs
是EventArgs
,但您的界面声明了一个可以传递EventArgs
的方法,而您实施的方法不接受{{} 1}},但只有更专业的EventArgs
。因此,您的实施不符合所需的合同。
答案 2 :(得分:1)
接口:
void Data_Input(object sender, EventArgs e);
您的实施:
public void Data_Input(object sender, SerialDataReceivedEventArgs e)
你需要这个:
public void Data_Input(object sender, EventArgs e)