Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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中更改基类并保持相同的实现#_C#_.net - Fatal编程技术网

C# 如何在C中更改基类并保持相同的实现#

C# 如何在C中更改基类并保持相同的实现#,c#,.net,C#,.net,这个问题很容易理解,但我找不到一个优雅的方法来解决这个问题。假设我已经实现了 public partial class PluginControl : ClientTabControlPlugin { ... } 注意,它是一个部分类,因为它部分是使用Windows窗体设计器创建的 现在我要实现这一点: public partial class PluginControl(2) : ContactTabControlPlugin { ... } 即,(几乎)相同的实现,但基类

这个问题很容易理解,但我找不到一个优雅的方法来解决这个问题。假设我已经实现了

public partial class PluginControl : ClientTabControlPlugin
{
    ...
}
注意,它是一个部分类,因为它部分是使用Windows窗体设计器创建的

现在我要实现这一点:

public partial class PluginControl(2) : ContactTabControlPlugin
{
    ...
}
即,(几乎)相同的实现,但基类不同。注意,我被迫这样做是为了使每个类都可以作为我正在使用的软件的插件使用

我如何在不创建PluginControl实现副本的情况下解决这个问题?

不,你不能这样做,C#没有多重继承

当然,您可以选择组合而不是继承,并使用共享类:

public partial class PluginControl : ClientTabControlPlugin
{
    public Foo DoFoo(Bar bar)
    {
        return new Foo(bar);
    }
}

public partial class PluginControl(2) : ContactTabControlPlugin
{
    public Foo DoFoo(Bar bar)
    {   
        return new Foo(bar);
    }
}

public class Foo
{
    public Foo(bar)
    {
        // shared implementation
    }
}
不,你不能那样做,C#没有多重继承

当然,您可以选择组合而不是继承,并使用共享类:

public partial class PluginControl : ClientTabControlPlugin
{
    public Foo DoFoo(Bar bar)
    {
        return new Foo(bar);
    }
}

public partial class PluginControl(2) : ContactTabControlPlugin
{
    public Foo DoFoo(Bar bar)
    {   
        return new Foo(bar);
    }
}

public class Foo
{
    public Foo(bar)
    {
        // shared implementation
    }
}
不,你不能那样做,C#没有多重继承

当然,您可以选择组合而不是继承,并使用共享类:

public partial class PluginControl : ClientTabControlPlugin
{
    public Foo DoFoo(Bar bar)
    {
        return new Foo(bar);
    }
}

public partial class PluginControl(2) : ContactTabControlPlugin
{
    public Foo DoFoo(Bar bar)
    {   
        return new Foo(bar);
    }
}

public class Foo
{
    public Foo(bar)
    {
        // shared implementation
    }
}
不,你不能那样做,C#没有多重继承

当然,您可以选择组合而不是继承,并使用共享类:

public partial class PluginControl : ClientTabControlPlugin
{
    public Foo DoFoo(Bar bar)
    {
        return new Foo(bar);
    }
}

public partial class PluginControl(2) : ContactTabControlPlugin
{
    public Foo DoFoo(Bar bar)
    {   
        return new Foo(bar);
    }
}

public class Foo
{
    public Foo(bar)
    {
        // shared implementation
    }
}

我认为在c#中没有任何优雅的方法来解决这个问题,但是一个选择是创建一个包含所有实际逻辑的第三个类,然后每个控件中每个方法的实现只需在第三个类的实例中调用匹配方法


另一个选项是为两个控制类添加接口,并将所有共享逻辑放入扩展方法。

我认为在c#中没有任何优雅的方法来解决这个问题,但一个选项是创建第三个类,其中包含所有实际逻辑,然后每个控件中每个方法的实现只需在第三个类的实例中调用匹配方法


另一个选项是为两个控制类添加接口,并将所有共享逻辑放入扩展方法。

我认为在c#中没有任何优雅的方法来解决这个问题,但一个选项是创建第三个类,其中包含所有实际逻辑,然后每个控件中每个方法的实现只需在第三个类的实例中调用匹配方法


另一个选项是为两个控制类添加接口,并将所有共享逻辑放入扩展方法。

我认为在c#中没有任何优雅的方法来解决这个问题,但一个选项是创建第三个类,其中包含所有实际逻辑,然后每个控件中每个方法的实现只需在第三个类的实例中调用匹配方法



另一种选择是向两个控制类添加接口,并将所有共享逻辑放在扩展方法中。

扩展方法不实现接口。OP使用的是一个插件系统,宿主应用程序很可能会调用像
ClientTabControlPlugin.Render()
@CodeCaster what这样的方法?我没有说扩展方法实现接口,我建议使用接口公开逻辑所需的任何属性,然后使用扩展方法实现逻辑并扩展该接口。没有理由解释为什么不能通过扩展方法调用Render或类似方法。请显示一些代码,说明这些扩展方法的含义。@CodeCaster没有,对不起。如果op问我,我会的,但我不知道你想通过这个请求实现什么,我很忙。我只是好奇你如何使用扩展方法来解决这个问题,但没关系。扩展方法不实现接口。OP使用的是一个插件系统,宿主应用程序很可能会调用像
ClientTabControlPlugin.Render()
@CodeCaster what这样的方法?我没有说扩展方法实现接口,我建议使用接口公开逻辑所需的任何属性,然后使用扩展方法实现逻辑并扩展该接口。没有理由解释为什么不能通过扩展方法调用Render或类似方法。请显示一些代码,说明这些扩展方法的含义。@CodeCaster没有,对不起。如果op问我,我会的,但我不知道你想通过这个请求实现什么,我很忙。我只是好奇你如何使用扩展方法来解决这个问题,但没关系。扩展方法不实现接口。OP使用的是一个插件系统,宿主应用程序很可能会调用像
ClientTabControlPlugin.Render()
@CodeCaster what这样的方法?我没有说扩展方法实现接口,我建议使用接口公开逻辑所需的任何属性,然后使用扩展方法实现逻辑并扩展该接口。没有理由解释为什么不能通过扩展方法调用Render或类似方法。请显示一些代码,说明这些扩展方法的含义。@CodeCaster没有,对不起。如果op问我,我会的,但我不知道你想通过这个请求实现什么,我很忙。我只是好奇你如何使用扩展方法来解决这个问题,但没关系。扩展方法不实现接口。OP使用的是一个插件系统,宿主应用程序很可能会调用像
ClientTabControlPlugin.Render()
@CodeCaster what这样的方法?我没有说扩展方法实现接口,我建议使用接口公开逻辑所需的任何属性,然后使用扩展方法实现逻辑并扩展该接口。没有理由解释为什么不能通过扩展方法调用Render或类似方法。请显示一些代码,说明这些扩展方法的含义。@CodeCaster没有,对不起。如果op问我,我会的,但我不知道你想通过这个请求实现什么,我很忙。我只是好奇你如何使用扩展方法来解决这个问题,但没关系。