【发布时间】:2014-02-21 14:47:56
【问题描述】:
考虑以下接口:
public interface IComponent { }
public interface ISwitch : IComponent
{
bool IsOn { get; }
event EventHandler SwitchedOff;
event EventHandler SwitchedOn;
}
public interface ISwitchable : ISwitch, IComponent
{
void SwitchOff();
void SwitchOn();
}
public interface IPowerSwitch : ISwitchable, ISwitch, IComponent { }
public interface IHeatingElement : ISwitchable, ISwitch, IComponent { }
我已经在这样的类中实现了 IPowerSwitch:
public class Kettle : IPowerSwitch
{
event EventHandler PowerOnEvent;
event EventHandler PowerOffEvent;
object objectLock = new Object();
public bool IsPowerOn;
public Kettle()
{
IPowerSwitch p = (IPowerSwitch)this;
p.SwitchedOn += new EventHandler(On_PowerOn_Press);
p.SwitchedOff += new EventHandler(On_PowerOff_Press);
}
void ISwitchable.SwitchOff()
{
EventHandler handler = PowerOffEvent;
if (handler != null)
{
handler(this, new EventArgs());
}
}
void ISwitchable.SwitchOn()
{
EventHandler handler = PowerOnEvent;
if (handler != null)
{
handler(this, new EventArgs());
}
}
bool ISwitch.IsOn
{
get { return IsPowerOn ; }
}
event EventHandler ISwitch.SwitchedOff
{
add
{
lock (objectLock)
{
PowerOffEvent += value;
}
}
remove
{
lock (objectLock)
{
PowerOffEvent -= value;
}
}
}
event EventHandler ISwitch.SwitchedOn
{
add
{
lock (objectLock)
{
PowerOnEvent += value;
}
}
remove
{
lock (objectLock)
{
PowerOnEvent -= value;
}
}
}
protected void On_PowerOn_Press(object sender, EventArgs e)
{
if (!((IPowerSwitch)sender).IsOn)
{
Console.WriteLine("Power Is ON");
((Kettle)sender).IsPowerOn = true;
((IPowerLamp)this).SwitchOn();
}
else
{
Console.WriteLine("Already ON");
}
}
protected void On_PowerOff_Press(object sender, EventArgs e)
{
if (((IPowerSwitch)sender).IsOn)
{
Console.WriteLine("Power Is OFF");
((Kettle)sender).IsPowerOn = false;
((IPowerLamp)this).SwitchOff();
}
else
{
Console.WriteLine("Already OFF");
}
}
}
现在我想在这个类中实现 IHeatingElement 接口。 IHeatingElement 具有与 IPowerSwitch 相同的方法。那么如何实现 IHeatingElement 的 SwitchOn 和 SwitchOff。 如果我尝试实现 IPowerSwitch.SwitchOff() 之类的东西,我会收到错误
显式接口声明中的“IPowerSwitch.SwitchOff”不是接口的成员。
我想要做的是,当引发电源开关事件时,应该引发加热事件。并且当加热关闭时,应引发电源开关关闭事件。
这是我在这里的第一个问题,所以如果问题有问题,请指导我。 提前感谢您的帮助。
【问题讨论】:
-
并非所有事情都需要通过继承来实现。
-
你不需要重新声明接口
ISwitchable继承ISwitch/IComponent所以你的IPowerSwitch/IHeatingElement可以继承ISwitchable