2014-10-28 40 views
1

几乎所有的标题。是否有可能在我没有的类上创建一个强制重载。例如,如果我要为NotifyIcon类(它是封闭的)创建一个包装器,我实际上不能使用它。我不得不返回一个实例,这有点杀死了做装饰者的能力。是否有可能创建一个转载重载的地方,我可以基本上返回NotifyIcon的私有实例?听起来很不自然,但我认为它会达到我想要的。是否有可能重载我不拥有的类的隐式或显式转换运算符?

通常情况下,我会做一些事情,如:

public static implicit operator MyClass(SomeOtherClass input) 
{ 
    // do things to come up with a MyClass 
} 

但是这只能在返回类型为MyClass的。我想做一些简单的事情:

public class MyPsuedoDecoratorClass 
{ 
    private NotifyIcon _icon; 

    public MyPsuedoDecoratorClass(NotifyIcon icon) 
    { 
     _icon = icon; 
    } 

    // some decorated methods 

    public static implicit operator NotifyIcon(MyPsuedoDecoratorClass input) 
    { 
     return _icon; 
    } 
} 

这样我就可以将它用作初始化包装。

+0

一个从()到()型模式将是这更好的。并且不会让你不能在扩展方法中重载操作符:( – RadioSpace 2014-10-28 21:53:16

+1

不,我不认为这个语言可以让你实现你要找的东西,不知道downvotes来自哪里,也许这就是SO-speak for “No” – 2014-10-28 21:53:57

+0

难道你只是施展对象,然后施放对象吗?我可能会误解你的问题,虽然 – 2014-10-28 21:55:58

回答

0

你基本上可以没有,但是你可以用NotifyIcon的标记来存储它的人工来源的对象,它仍然是优雅:

public static class NotifyIconExtesionMethods { 
    public static MyClass As<T>(this NotifyIcon notifyIcon) { 
     return notifyIcon.Tag as T; 
    } 
} 

class MyClass { 
    private NotifyIcon notifyIcon; 

    public MyClass() { 
     notifyIcon = ...; 
     ... 
     notifyIcon.Tag = this; 
    } 
    public T As<T>() { 
     return notifyIcon as T; 
    } 
} 

//In some method: 
var notifyIcon = new MyClass().As<NotifyIcon>(); 
... 
var myClass = notifyIcon.As<MyClass>(); 
相关问题