现在,这两个类中的每一个都实例化该对象并使用它来执行常见操作,一切都很好.现在一切都很好.
当这两个类中的每一个都必须暴露公共例程必须引发的事件时,就会出现问题.哦,哦.怎么办?
好吧,我们可以在两个类中的每个类中执行类似的操作:
public event EventHandler CommonEvent { add { theCommonObject.CommonEvent += value; } remove { theCommonObject.CommonEvent -= value; } }
但是现在这个代码需要在两个类中的每个类中重复,代码的读者也可能会对此代码感到有些困惑.添加和删除不是很常见的关键字,至少.
尽管如此,这两个类中都存在重复的代码,不仅如此,但这个解决方案并不总是有效!
例如,如果CommonObject在单个方法中进行本地实例化,并且其范围仅在该方法内,该怎么办?
那么,在那种情况下,我们甚至无法使用之前发布的快捷代码,我们必须完全复制这两个类中的代码.不仅如此,它只是尖叫不合时宜,因为我们基本上只是将一个事件的副本重新提升给客户.
public event EventHandler SomeCommonEvent; private void SomeMethod() { theCommonObject = new theCommonObject(); theCommonObject.DoSomething(); theCommonObject.someCommonEvent += thisClass_SomeCommonEvent; } private void thisClass_SomeCommonEvent(object sender,EventArgs e) { var handler = SomeCommonEvent; if (handler != null) { handler(this,e); } }
正如您所看到的,在两种情况下都存在重复的代码,但在第二种情况下甚至存在更多代码,因为该对象是方法的本地而不是成员变量.
除了使用继承之外,我无法想到解决这个问题的方法,但我不认为这样做会产生语义意义,并且许多人经常声称组合在复杂性降低,易于理解方面优于继承等等.
解决方法
public class A { private SomeCommonObject theCommonObject; public event EventHandler CommonEvent { add { theCommonObject.CommonEvent += value; } remove { theCommonObject.CommonEvent -= value; } } public A() { theCommonObject = new SomeCommonObject(); } }
哪里有问题? theCommonObject永远不能“在单个方法中进行本地实例化,其范围仅在该方法中”.
是的,添加和删除不常用.所以呢?该类的客户端永远不会看到添加和删除.他们仍然使用Traditional =语法订阅该事件.就客户而言,添加和删除语法不是问题.而你,正在创建课程的开发人员,应该知道这些事情.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。