Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 没有复制和粘贴,如何以相同的方式扩展两个类?_C#_.net - Fatal编程技术网

C# 没有复制和粘贴,如何以相同的方式扩展两个类?

C# 没有复制和粘贴,如何以相同的方式扩展两个类?,c#,.net,C#,.net,我编写了一个由所有者绘制的TabControl,但我们的项目也使用了TabWorkspace,它源自TabControl。目前,我有 public class OurTabControl : TabControl { // some code that overrides protected methods } public class OurTabWorkspace : TabWorkspace { // the same code } 我只希望共享代码出现在一个地方,所

我编写了一个由所有者绘制的
TabControl
,但我们的项目也使用了
TabWorkspace
,它源自
TabControl
。目前,我有

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

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

我只希望共享代码出现在一个地方,所以我们不必维护两个副本。这在C#中是否可能,如果可能,如何实现?

您可以使用接口和编写扩展方法来实现

class OurTabControl: IBehavior
class OurTabWorkspace: IBehavior

interface IBehavior
{    
}

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

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

使用分部类如何?
或者,在一个类中定义所有共享方法,并让两个继承的类对其进行实例化怎么样。

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

您可以向C#中的接口添加扩展方法?我从来不知道。如果你能克服这些缺点,那就好了,你需要确保在使用这些方法的每个代码文件中都有一个包含扩展类的名称空间的using语句。更重要的是,扩展方法不能操作私有或受保护的成员。最重要的是,如果共享代码需要维护一些额外的状态,那么它将被放置在何处。当然,在许多情况下,这些限制是可以接受的,但在其他情况下,它不是解决方案。@Anthony,您提出的观点绝对有效。我没有考虑尝试用扩展方法覆盖受保护的成员。我想在overidden方法中调用扩展方法。答案取决于共享代码需要做什么。例如,是否希望两个类都公开公共成员?这个共享代码是否需要维护一些与其操作相关的状态?也许我不完全理解OP的问题,但我的理解是他有一个派生的TabControl和派生的TabWorkspace(“OurTabControl”和“OurTabWorksapce”。)我读到这个问题是说这两个派生类共享公共的(当前复制粘贴的代码。)一种可能的方法是将单个方法集重构为静态方法,可以由两个派生类共享。分部类有何帮助?这只是将代码分解为多个文件。