有没有办法创建某种只允许通过事件访问对象的接口?C#:有没有办法确保一个对象只能通过它的事件来访问?
回答
难道你不能只定义一个接口只有它的事件吗?
例如:
interface IExample
{
event EventHandler Event1;
event EventHandler Event2;
}
class Obj : IExample
{
public event EventHandler Event1;
public event EventHandler Event2;
}
用法:
IExample obj = new Obj();
obj.Event1 += Event1_Handler;
obj.Event2 += Event2_Handler;
+1 - 好的,我没有想到这个解决方案。我实在太拘泥于了。 – 2009-11-02 22:21:11
+1。好答案。比我的好。 – David 2009-11-02 22:24:59
没有进一步的信息,最好的答案我是你只需要确保所有成员的属性,功能,等)被宣布为私人,除了将公开的事件。
虽然我不得不承认,但我很难理解这将如何有用,以及如果只有事件才能触发事件,会触发一个事件。这就像说你可以创建一个你不能打电话的电话,但只能听到响铃(IncomingCall事件)。
我相信,在我们职业生涯的某个时候,我们中的很多人都会被要求设计一个'你不能打电话的电话,但只能由没有意识到他们要求的人回答'。我已经。 – 2009-11-02 22:22:18
的确如此。好点子。 – David 2009-11-02 22:23:22
关于手机analogy - 来自我自己的经验:所有对象的所有成员(属性,事件,方法等)始终可以在运行时访问,而不管访问修饰符设置为什么(私有,内部,受保护等等)通过.NET反射技术 - System.Reflection。*类等。 一旦我发现了这一点,我不再担心试图通过访问修饰符将事情压得太紧,因为最终这是不可能的,所有事情都要考虑。当然,在编译时隐藏成员是有意义的,以强制执行期望的操作参数。 – 2009-11-02 22:53:35
像这样的设置会使用汇编只露出事件到客户端:
interface ISomething {
event EventHandler MyEvent;
}
internal class MyClass : ISomething {
...
}
public ClassFactory {
public ISomething GetClass(){ // factory method
return new MyClass();
}
}
或者,如果你需要限制使用这个类在自己的图书馆,以及你可以这样做:
public class MyClass : ISomething {
private MyClass(){} // private constructor
public ISomething GetClass(){ // factory method
return new MyClass();
}
}
像这样的东西可以用,如果你只需要得到它的事件,以及一个单独的对象,这是有意义的,如果你只是想有一个通用的方式来订阅例如该对象的状态事件相结合。
请注意,调用者访问的任何对象都可以具有其中的任何字段accessed through reflection。
如果您的问题集中在防止人们意外地错误地调用您的对象,马特B.的答案是伟大的。
如果您的问题集中在使某人无法恶意访问您的对象的私人字段,这是不可能的。
- 1. 有没有办法通过RMI对象发送事件?
- 2. 当通过方法访问时,对象没有保存实例
- 3. 有没有办法通过哈希来初始化一个对象?
- 4. 有没有办法让一个类对象通过持有它的变量名来表示自己?
- 5. 有没有办法访问给定对象的所有引用?
- 6. 有没有办法让一个值只能访问嵌套类VB.NET的父类?
- 7. 有没有办法通过两个has_many关联来访问STI表?
- 8. 有没有办法通过JavaScript来设定一个PHP变量
- 9. 有没有办法只通过分配属性来自动创建一个JavaScript对象?
- 10. 有没有办法解码tf.Summary protobuf对象并在TensorFlow中访问它的值?
- 11. 有没有办法确保OSGi中的软件包的访问权限?
- 12. 有没有办法通过它的URL搜索文件?
- 13. 有没有办法通过WatchKit访问触觉反馈?
- 14. @ users.each do | user | ---有没有办法来对多个对象
- 15. 有没有办法从另一个访问一个iframe?
- 16. 有没有办法监控c#文件的访问?
- 17. 有没有办法通过UIActivityViewController发送日历事件?
- 18. 如何使一个对象可以通过C#中的所有文件访问
- 19. 有没有办法让一个窗口的所有BindingExpression对象?
- 20. 有没有办法在linux中查看谁查看/访问过一个文件?
- 21. 有没有办法在C#中通过它的名字找到文件?
- 22. 有没有办法访问通知中心显示的通知?
- 23. 有没有办法确定java中有多大的对象?
- 24. 有没有办法通过会话传递对象并使用其功能?
- 25. C#通过一个事件从多个对象路由事件
- 26. 有没有办法访问一个向量内的索引
- 27. 有没有办法制作一个只能播放一次的音频文件?
- 28. 有没有办法知道一个对象的C#方法是否被调用?
- 29. 有没有办法指出DateTime对象只有Date值?
- 30. 有没有办法让JQuery ajax成功函数来访问它包含的对象?
你可以提供一个用例吗?你的问题有点含糊。 – 2009-11-02 22:16:07
你是否只有某些你想要访问的类,所以你有一些东西在实现接口?界面只是公共方法,所以具体的类需要做。 – 2009-11-02 22:16:27