c#接口实现错误

时间:2016-10-31 12:21:55

标签: c# interface

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

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个对象。

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

3 个答案:

答案 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对象。

虽然SerialDataReceivedEventArgsEventArgs,但您的界面声明了一个可以传递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)