Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#接口实现错误_C#_Interface - Fatal编程技术网

c#接口实现错误

c#接口实现错误,c#,interface,C#,Interface,我正在为我的应用程序开发一个通讯管理器,其设计如下: i通讯器接口,通用通讯器 public interface ICommunicator { bool openConnection(); bool closeConnection(); bool isConnectionOpen(); Form getConfigurationForm(); void Data_Input(object sender, EventArgs e); } 目前,一个单

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

i通讯器接口,通用通讯器

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

    bool isConnectionOpen();
    Form getConfigurationForm();

    void Data_Input(object sender, EventArgs e);
}
目前,一个单一的混凝土通信器是串行通信器:

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;
    }
}
公共类串行通讯器:ICommunicator
{
公共委托bool setPortDelegate(字符串portName);
公共委托bool setbaudrate委托(int波特率);
专用串口;
公共串行通讯器()
{
串行=新的串行端口();
loadDefaultSerialPreset(串行);
serial.DataReceived+=数据输入;
}
公共bool openConnection()
{
if(串行等参)
{
返回false;
}
尝试
{
serial.Open();
}
捕获(例外)
{
//无法打开端口
返回false;
}
返回serial.IsOpen;
}
公共bool closeConnection()
{
尝试
{
serial.Close();
}
捕获(例外)
{
返回false;
}
return!serial.IsOpen;
}
公共bool isConnectionOpen()
{
返回此.serial.IsOpen;
}
公共bool sendData(字符串文本)
{
如果(!this.serial.IsOpen)
{返回false;}
返回true;
}
公共无效数据\u输入(对象发送方,SerialDataReceivedEventArgs e)
{
字符串s=serial.ReadLine();
//待定
}
公共表单getConfigurationForm()
{
返回新的portConf(setPortName,setBaudRate);
}
私有布尔集合端口名(字符串端口名)
{
if(portName==null | | | portName.Length<1 | |!portName.StartsWith(“COM”))
{
返回false;
}
if(串行等参)
{
返回false;
}
serial.PortName=PortName;
返回true;
}
专用bool setBaudRate(整数波特率)
{
如果(波特率<9600 | |波特率>115200)
{
返回false;
}
if(串行等参)
{
返回false;
}
串行波特率=波特率;
返回true;
}
专用void loadDefaultSerialPreset(串行端口s)
{
//默认预设
s、 波特率=115200;
s、 PortName=“COM1”;
//默认设置
s、 数据位=8;
s、 丢弃空=假;
s、 DtrEnable=false;
s、 握手=握手。无;
s、 奇偶=奇偶。无;
s、 ParityReplace=63;
s、 ReadBufferSize=4096;
s、 ReadTimeout=-1;
s、 ReceivedBytesThreshold=1;
s、 RtsEnable=false;
s、 停止位=停止位。1;
s、 WriteBufferSize=2048;
s、 WriteTimeout=-1;
}
}
问题是,编译器说SerialCommunicator没有实现接口:

“SerialCommunicator”未实现接口成员“ICommucator.Data\u输入(对象,事件参数)”

我不明白为什么它会给我这个错误。我确实有
Data\u输入(object,SerialDataReceivedEventArgs)
,尽管每个
SerialDataReceivedEventArgs
也是一个
EventArgs
对象

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

接口:

void Data_Input(object sender, EventArgs e);
您的实施:

public void Data_Input(object sender, SerialDataReceivedEventArgs e)
您需要具备以下功能:

public void Data_Input(object sender, EventArgs e)
接口:

void Data_Input(object sender, EventArgs e);
您的实施:

public void Data_Input(object sender, SerialDataReceivedEventArgs e)
您需要具备以下功能:

public void Data_Input(object sender, EventArgs e)
这些也是:

//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();
    }
}
//接口
公共接口ICommucator
其中TEventArgs:EventArgs
{
无效数据输入(对象发送方,TEventArgs e);
}
//衍生
公共类串行通讯器:ICommunicator
{
公共无效数据\u输入(对象发送方,SerialDataReceivedEventArgs e)
{
抛出新的NotImplementedException();
}
}
即使您不在此处使用泛型,请记住,尽管该方法将有一个
EventArgs
参数,但您当然可以将派生类型传递给它。

这些:

//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();
    }
}
//接口
公共接口ICommucator
其中TEventArgs:EventArgs
{
无效数据输入(对象发送方,TEventArgs e);
}
//衍生
公共类串行通讯器:ICommunicator
{
公共无效数据\u输入(对象发送方,SerialDataReceivedEventArgs e)
{
抛出新的NotImplementedException();
}
}
即使您不在这里使用泛型,也要记住,尽管该方法将有一个
EventArgs
参数,但您当然可以将派生类型传递给它

我不明白为什么它会给我这个错误。我有数据输入(对象,SerialDataReceivedEventArgs),尽管每个SerialDataReceivedEventArgs也是一个EventArgs对象

尽管
SerialDataReceivedEventArgs
是一个
EventArgs
,但您的接口声明了一个可以传递
EventArgs
的方法,并且您实现的方法不接受
EventArgs
,而只接受更专业的
SerialDataReceivedEventArgs
。因此,您的实现没有履行所需的合同

我不明白为什么它会给我这个错误。我有数据输入(对象,SerialDataReceivedEventArgs),尽管每个SerialDataReceivedEventArgs也是一个EventArgs对象

虽然