2009-11-02 42 views

回答

15

难道你不能只定义一个接口只有它的事件吗?

例如:

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; 
+0

+1 - 好的,我没有想到这个解决方案。我实在太拘泥于了。 – 2009-11-02 22:21:11

+0

+1。好答案。比我的好。 – David 2009-11-02 22:24:59

2

没有进一步的信息,最好的答案我是你只需要确保所有成员的属性,功能,等)被宣布为私人,除了将公开的事件。

虽然我不得不承认,但我很难理解这将如何有用,以及如果只有事件才能触发事件,会触发一个事件。这就像说你可以创建一个你不能打电话的电话,但只能听到响铃(IncomingCall事件)。

+1

我相信,在我们职业生涯的某个时候,我们中的很多人都会被要求设计一个'你不能打电话的电话,但只能由没有意识到他们要求的人回答'。我已经。 – 2009-11-02 22:22:18

+0

的确如此。好点子。 – David 2009-11-02 22:23:22

+0

关于手机analogy - 来自我自己的经验:所有对象的所有成员(属性,事件,方法等)始终可以在运行时访问,而不管访问修饰符设置为什么(私有,内部,受保护等等)通过.NET反射技术 - System.Reflection。*类等。 一旦我发现了这一点,我不再担心试图通过访问修饰符将事情压得太紧,因为最终这是不可能的,所有事情都要考虑。当然,在编译时隐藏成员是有意义的,以强制执行期望的操作参数。 – 2009-11-02 22:53:35

1

像这样的设置会使用汇编只露出事件到客户端:

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(); 
    } 
} 

像这样的东西可以用,如果你只需要得到它的事件,以及一个单独的对象,这是有意义的,如果你只是想有一个通用的方式来订阅例如该对象的状态事件相结合。

0

请注意,调用者访问的任何对象都可以具有其中的任何字段accessed through reflection

如果您的问题集中在防止人们意外地错误地调用您的对象,马特B.的答案是伟大的。

如果您的问题集中在使某人无法恶意访问您的对象的私人字段,这是不可能的。

相关问题