2009-06-19 35 views
2

我已经写了一个所有者绘制的TabControl,但我们的项目也使用TabWorkspace,它来自TabControl。目前,我有如何在不复制和粘贴的情况下以相同的方式扩展两个类?

public class OurTabControl : TabControl 
{ 
    // some code that overrides protected methods 
} 

public class OurTabWorkspace : TabWorkspace 
{ 
    // the same code 
} 

我想只有共享代码出现在一个地方,所以我们不必保持两个副本。这可能在C#中,如果是这样,如何?

+0

答案真的取决于你的共享代码需要做什么。例如,你是否希望两个类都暴露普通公众成员?这个共享代码是否需要维护一些与其操作相关的状态? – AnthonyWJones 2009-06-19 13:28:31

回答

8

你可以使用一个接口并写一个扩展方法。

class OurTabControl: IBehavior 
class OurTabWorkspace: IBehavior 

interface IBehavior 
{  
} 

static class BehaviorExtensions 
{ 
    static [returntype] RepeatedBehavior(this IBehavior behavior) 
    { 
     //repeated code here 
    } 
} 
+1

您可以将扩展方法添加到C#中的接口吗?我从来不知道这一点。凉。 – 2009-06-19 13:14:16

+0

这很好,如果你可以克服缺点,你需要确保每个代码文件中包含扩展类的命名空间都有一个using语句,在这些代码文件中使用这些方法。更重要的是,扩展方法不能操纵私有或受保护的成员。最重要的是,如果共享代码需要维护一些额外的状态,它将放在哪里。当然,在许多情况下,这些限制是可以接受的,但在其他情况下则不是解决方案。 – AnthonyWJones 2009-06-19 13:25:07

+0

@Anthony您提出的观点绝对有效。我没有想过用扩展方法覆盖受保护的成员。我正在考虑在overidden方法中调用扩展方法。 – Joseph 2009-06-19 13:37:53

1

也许会将共享代码重构为一组静态方法?

0

如何使用部分类? 或者,在一个类中定义所有的共享方法,并同时拥有两个继承类来实例化它。

1

您可以创建一个内部帮助程序类,其中包含通用代码并将其作为OurTabControl和OurTabWorkspace中的私有成员引用。由于TabWorkspace扩展了TabControl,您应该能够利用多态性并将TabControl参数传递给helper类中的方法。您仍然需要重写这两个扩展类中的任何常用方法,并从那里调用helper类方法和/或base方法。

相关问题