Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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#_Oop_Interface_Inheritance - Fatal编程技术网

C# 界面及;遗产

C# 界面及;遗产,c#,oop,interface,inheritance,C#,Oop,Interface,Inheritance,C#,VS 2008 我有4个案例,比如a、b、c、d,我计划将它们分开,并创建单独的类 这4种情况有一些共同之处,我将它们放在一个接口中,并创建一个实现该接口的基类。现在a&b、a&c、c&d之间有一些共同点,不知道如何制作一个好的/干净的工具 谢谢有几种选择 可以让c和d从a继承,d从c继承。 您可以为每对a/b、a/c和c/d创建一个基类。 您可以复制功能。 您可以通过助手类提供功能(静态方法可能是一个选项) 这实际上取决于共享的功能以及类的预期用途。有几个选项 可以让c和d从a继承,d从

C#,VS 2008 我有4个案例,比如a、b、c、d,我计划将它们分开,并创建单独的类 这4种情况有一些共同之处,我将它们放在一个接口中,并创建一个实现该接口的基类。现在a&b、a&c、c&d之间有一些共同点,不知道如何制作一个好的/干净的工具


谢谢

有几种选择

可以让c和d从a继承,d从c继承。 您可以为每对a/b、a/c和c/d创建一个基类。 您可以复制功能。 您可以通过助手类提供功能(静态方法可能是一个选项)


这实际上取决于共享的功能以及类的预期用途。

有几个选项

可以让c和d从a继承,d从c继承。 您可以为每对a/b、a/c和c/d创建一个基类。 您可以复制功能。 您可以通过助手类提供功能(静态方法可能是一个选项)


这实际上取决于共享的功能以及类的预期用途。

这取决于常见事物的工作方式以及它们与私有/受保护数据的关系和使用方式,但组合通常可以作为继承的补充或替代

将a、b、c和d的不同实现中使用的帮助器类的公共部分划分出来


这只有在实现没有与每个类的私有数据紧密耦合的情况下才可能实现。

这取决于公共事物的工作方式以及它们与私有/受保护数据的关系和使用方式,但组合通常可以作为继承的补充或替代

将a、b、c和d的不同实现中使用的帮助器类的公共部分划分出来


这只有在实现没有与每个类的私有数据紧密耦合的情况下才可能实现。

一般来说,只有当对象是同一对象的不同类型时,才应该使用继承。如果是这种情况,那么您可以使用继承来共享基础对象定义中固有的实现

如果类a、b、c和d实际上不是同一对象的不同类型,那么您可以尝试将它们的公共功能封装在内部引用的对象中

public class a
{
    private CommonFunctionalityClass commonFunc;

    public a()
    {
        this.commonFunc = new CommonFunctionalityClass();
    }
} 

当你想做一些普通的事情时,你只需要调用你的commonFunc实例。您可以对a/b、b/c和c/d进行相同的封装,其中通过a共享功能,并使用内部引用的对象建立关系。这样,您就不会重复代码,但可以灵活地共享功能。

一般来说,只有当对象是同一对象的不同类型时,才应该使用继承。如果是这种情况,那么您可以使用继承来共享基础对象定义中固有的实现

public interface IABInterface
{
    //Whatever is common to A and B. It will have to be implemented in the classes
}

public interface IACInterface
{
    //Whatever is common to A and C. It will have to be implemented in the classes
}

public interface ICDInterface
{
    //Whatever is common to C and D. It will have to be implemented in the classes
}

public class ABCDBase
{
    //Whatever is common to all classes
}

public class A : ABCDBase, IABInterface, IACInterface
{
}

public class B : ABCDBase, IABInterface
{
}

public class C : ABCDBase, IACInterface, ICDInterface
{
}

public class D : ABCDBase, ICDInterface
{
}
如果类a、b、c和d实际上不是同一对象的不同类型,那么您可以尝试将它们的公共功能封装在内部引用的对象中

public class a
{
    private CommonFunctionalityClass commonFunc;

    public a()
    {
        this.commonFunc = new CommonFunctionalityClass();
    }
} 
当你想做一些普通的事情时,你只需要调用你的commonFunc实例。您可以对a/b、b/c和c/d进行相同的封装,其中通过a共享功能,并使用内部引用的对象建立关系。这样您就不会重复代码,但可以灵活地共享功能

public interface IABInterface
{
    //Whatever is common to A and B. It will have to be implemented in the classes
}

public interface IACInterface
{
    //Whatever is common to A and C. It will have to be implemented in the classes
}

public interface ICDInterface
{
    //Whatever is common to C and D. It will have to be implemented in the classes
}

public class ABCDBase
{
    //Whatever is common to all classes
}

public class A : ABCDBase, IABInterface, IACInterface
{
}

public class B : ABCDBase, IABInterface
{
}

public class C : ABCDBase, IACInterface, ICDInterface
{
}

public class D : ABCDBase, ICDInterface
{
}
您可以稍后在静态类扩展中为接口创建方法,以避免在接口实现中复制方法的代码(换句话说,不要在接口中定义方法,只定义属性)。通过重构,可以很容易地在接口中实现属性。 如果有扩展属性就好了。对未来充满希望

编辑

像这样:

public static class Helper
{
    public static void IABMethod1(this IABInterface aOrBObject, arguments args)
    {
        //This will be available for any A or B object without duplicating any code
    }
}
您可以稍后在静态类扩展中为接口创建方法,以避免在接口实现中复制方法的代码(换句话说,不要在接口中定义方法,只定义属性)。通过重构,可以很容易地在接口中实现属性。 如果有扩展属性就好了。对未来充满希望

编辑

像这样:

public static class Helper
{
    public static void IABMethod1(this IABInterface aOrBObject, arguments args)
    {
        //This will be available for any A or B object without duplicating any code
    }
}

你能举个更具体的例子说明你在做什么吗?这将有助于决定如何进行。目前无法回答你的问题,因为它太模糊了。请给出一个具体的例子。你确定继承(“is a”)是正确的方法吗?也许“hasaa”更合适?再说一次,更多的细节会有所帮助。对不起。我有4个Excel自定义项插件A、B、C、D,它们使用web服务在Excel中请求数据和绘制数据。每个函数使用不同的web服务调用(URL和负载)。有一些可选参数应用于所有函数,如排序顺序、显示摘要等。一些选项只能应用于A&B、A&C、C&D。在使用if/switch语句时,我有一个类来处理这个问题。我想清理代码,从类调用IFunc中提取一个接口,创建一个基类BaseFunc,我想创建一个从BaseFunc继承的类Func a_B_Common,Func a,Func B from Func a_CommonFunc a_C_Common,Func a需要从Func a_B_Common和Func a_Common继承,但C#是单继承,函数C也是一样,所以我不知道如何正确处理这个问题。你能给出更多具体的例子吗?这将有助于决定如何进行。目前无法回答你的问题,因为它太模糊了。请给出一个具体的例子。你确定继承(“is a”)是正确的方法吗?也许“hasaa”更合适?再说一次,更多的细节会有所帮助。对不起。我有4个Excel自定义项插件A、B、C、D,它们使用web服务在Excel中请求数据和绘制数据。每个函数使用不同的web服务调用(URL和负载)。有一些可选参数应用于所有函数,如排序顺序、sho