4

我有以下课程:

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':预期接口名称

当我对此进行研究时,我尝试构建一个界面 - 但由于我对完成这一点的了解不够多,所以结果很短。您能否帮助我理解这一点,或者为我指出一篇好文章的方向以帮助我这样做?

4

4 回答 4

6

我正在尝试在我的一个项目中继承它,但是我已经在那里继承了另一个类

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

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

C# 中的一个常见解决方案是从其中一个类中提取接口,嵌入实现的实例,并通过组合将接口调用转发到类中包含的实现。

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

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;}
    }
}
于 2013-10-04T01:15:40.097 回答
2

您不能从多个类继承,但可以从类和接口继承

你可以在 C# 中继承多少个类?

接口基本上是一个合同。您将需要一个具体的类来实现合同。

您应该链接您的继承,例如 B: A 、 C: B,或者为 CommonEvents 创建一个接口,如下所示:

 public interface ICommonEvents
{
    void BroadcastMessage(string text);
}

public class CommonEvents : ICommonEvents
{
    public void BroadcastMessage(string text)
    {

    }
}

现在您可以实现接口并将具体类 CommonEvents 作为依赖项并将您的方法委托给它

public class ItemDal : Common.Dal.BaseDal, ICommonEvents
{
    private readonly CommonEvents _commonEvents;

    public ItemDal(CommonEvents commonEvents)
    {
        _commonEvents = commonEvents;
    }

    #region Implementation of ICommonEvents

    void ICommonEvents.BroadcastMessage(string text)
    {
        _commonEvents.BroadcastMessage(text);
    }

    #endregion
}

在这样做之前,如果你真的需要这样做,我会敦促你考虑你的设计,因为它可能违反了单一责任原则(https://en.wikipedia.org/wiki/Single_responsibility_principle)。您的 DAL 类不应进行错误处理

于 2013-10-04T01:20:30.420 回答
2

CommonEvents 不是接口,它是一个抽象类。抽象类必须被继承,而接口是编译器所期望的。是关于差异的文章。能不能把抽象类改成接口,把代码放到父类里?像这样

public interface class ICommonEvents 
{
    /// <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);

    /// <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;
}

public class CommonEvents : DisposableObject, ICommonEvents
{
    /// <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 : CommonEvents
{ ...
于 2013-10-04T01:27:29.960 回答
2

在 C# 中,aclass只能相互继承class(尽管该类可能从另一个类继承,依此类推)。

class后面的任何东西都:必须是一个接口,所以编译器期望CommonEvents是一个interface,但它不是。

这里有两种方法:

  1. Common.Dal.BaseDal继承CommonEvents(所以ItemDal会继承CommonEvents“通过” Common.Dal.BaseDal
  2. 在里面使用你的一个类ItemDal。所以ItemDal可能会暴露类似于方法的成员,但它所做的一切都会调用到包含所有逻辑的组件中。这被称为组合。
于 2013-10-04T01:19:35.160 回答