c# - 需要接口(interface)名称 - 但我不明白如何实现它

标签 c# interface

我有以下类(class):

public abstract class CommonEvents : DisposableObject
{
    /// <summary>
    /// Internal method for storing error messages to our event
    /// </summary>
    /// <param name="message"></param>
    /// <param name="showException"></param>
    /// <param name="exception"></param>
    public void OnError(string message, OnErrorEventsArgs.ShowExceptionLevel showException, Exception exception)
    {
        if (_onErrorEvent == null) return;

        var e = new OnErrorEventsArgs(message, showException, exception);

        _onErrorEvent(this, e);
    }

    /// <summary>
    /// Internal event handler allowing for logging of events within the class
    /// </summary>
    private EventHandler<OnErrorEventsArgs> _onErrorEvent;

    /// <summary>
    /// Public event handler allowing for accessibility outside of the class
    /// </summary>
    public event EventHandler<OnErrorEventsArgs> OnErrorEvent
    {
        add { _onErrorEvent += value; }
        remove { _onErrorEvent += value; }
    }
}

我试图在我的一个项目中继承它,但是我已经在那里继承了另一个类,代码如下:

public class ItemDal : Common.Dal.BaseDal, CommonEvents
{

我收到的错误是

'CommonEvents': Interface Name expected

当我对此进行研究时,我尝试构建一个界面 - 但由于我对实现这一目标的理解不够深入,所以后来功亏一篑。能否请您帮助我理解这一点或指出一篇好文章的方向来帮助我这样做?

最佳答案

And I'm trying to inherit it in one of my projects, however I'm already inheriting another class there

这是编译器告诉您 C# 不支持多重继承的方式。如果将类放在基列表中,则其余名称必须引用接口(interface)。

只有当其中一个类直接或间接继承了另一个类时,您才能继承两个类;这样您就可以继承最派生的类,以及恰好是其基类的其他类。

C# 中的一个常见解决方案是从其中一个类中提取一个接口(interface),嵌入一个实现的实例,然后通过组合将接口(interface)调用转发给包含在您的类中的实现。

在您的情况下,它看起来像这样:

interface ICommonEvents {
    void OnError(string message, OnErrorEventsArgs.ShowExceptionLevel showException, Exception exception);
    event EventHandler<OnErrorEventsArgs> OnErrorEvent {add;remove;}
}
// Keep the implementation the same
public class CommonEvents : DisposanbleObject, ICommonEvents {
    ...
}
// Here is your derived class:
public class ItemDal : Common.Dal.BaseDal, ICommonEvents {
    private readonly CommonEvents ce = ... // Initialize your common events
    void OnError(string message, OnErrorEventsArgs.ShowExceptionLevel showException, Exception exception) {
        ce.OnError(message, showException, exception);
    }
    event EventHandler<OnErrorEventsArgs> OnErrorEvent {
        add {ce.OnErrorEvent += value;}
        remove {ce.OnErrorEvent -= value;}
    }
}

关于c# - 需要接口(interface)名称 - 但我不明白如何实现它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19171588/

相关文章:

c# - SHA256 可以多线程来提高速度吗?

c# - Automapper DynamicMap 随机无法映射匿名类型

c# - 查找文本小写或大写

c# - 从数据库中下载照片 C#

Laravel 标记所有实现接口(interface)的类

delphi - 如何将接口(interface)名称映射到不同的方法名称?

c# - 使用 .NET Flurl/HttpClient 设置每个请求的代理(或轮换代理)

C# 图形界面问题

iPhone开发-TableView属性

map - map[string]interface{} 比 golang 中的 map[string]string 快吗?还是 "strconv"功能太慢?