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

C# 适当的类结构#

C# 适当的类结构#,c#,oop,inheritance,C#,Oop,Inheritance,我需要一些关于为6种不同但相似类型的应用程序构建类的建议。这6种类型都有一些共享的属性和方法。还有一些属性和方法,其中3个、4个或5个将共享,但对其他人没有意义 目前,我有一个抽象基类,具有: 所有子类将使用的属性和方法已经实现 一些子类将使用的方法标记为抽象,在子类中实现 某些子类将使用的属性被标记为可空,以便不使用该属性的子类可以为空 不过,这似乎不是最好的解决方案。我觉得我已经提供了足够的细节,但如果这没有意义,请让我知道,我会尝试提供更好的描述 编辑--添加代码示例 public a

我需要一些关于为6种不同但相似类型的应用程序构建类的建议。这6种类型都有一些共享的属性和方法。还有一些属性和方法,其中3个、4个或5个将共享,但对其他人没有意义

目前,我有一个抽象基类,具有:

  • 所有子类将使用的属性和方法已经实现
  • 一些子类将使用的方法标记为抽象,在子类中实现
  • 某些子类将使用的属性被标记为可空,以便不使用该属性的子类可以为空
不过,这似乎不是最好的解决方案。我觉得我已经提供了足够的细节,但如果这没有意义,请让我知道,我会尝试提供更好的描述

编辑--添加代码示例

public abstract class BaseClass
{
    //all classes inheriting from BaseClass would use these properties
    public string Property1{ get; set; }
    public string Property2{ get; set; }

    public void Method1() {
        //all classes inheriting from BaseClass would use this method
    }

    //more than one class (but not all classes) 
    //  inheriting from BaseClass would use these properties
    public int? Property3 { get; set; }
    public bool? Propert4 { get; set; }

    public abstract void Method2() {
        //more than one class (but not all classes) 
        //  inheriting from BaseClass would use this method

        //those not using this method would have empty getters and setters maybe?
    }
}
不过,这似乎不是最好的解决方案。我觉得我已经提供了足够的细节,但如果这没有意义,请让我知道,我会尝试提供更好的描述

虽然没有什么细节,但听起来您最好在类层次结构中有一个单独的“层”

类3、4和5可以派生自单独的抽象类,而抽象类又继承了您的“基类”。这将消除类1和类2中包含“未使用的”方法和属性的需要

基本上,“某些子类将使用的属性标记为可空,以便不使用该属性的子类可以为空”不在基类中,而是添加到子类中,而子类又是3、4和5的子类

不过,这似乎不是最好的解决方案。我觉得我已经提供了足够的细节,但如果这没有意义,请让我知道,我会尝试提供更好的描述

虽然没有什么细节,但听起来您最好在类层次结构中有一个单独的“层”

类3、4和5可以派生自单独的抽象类,而抽象类又继承了您的“基类”。这将消除类1和类2中包含“未使用的”方法和属性的需要


基本上,“某些子类将使用的属性标记为可空,以便不使用该属性的子类可以为空”不在基类中,而是添加到子类中,而子类又是3、4和5的子类。

您应该详细说明层次结构以避免使用可空。您应该创建

  • 包含其他公共属性或属性的中间子类
  • 声明一个实现公共属性的接口,并让这些类实现它

  • 您应该详细说明层次结构,以避免使用nullables。您应该创建

  • 包含其他公共属性或属性的中间子类
  • 声明一个实现公共属性的接口,并让这些类实现它

  • 你知道你可以这样继承吗

                    ****************************                          
                    *                          *                          
                    *         FooBase          *                          
                    *                          *                          
                    ****************************                          
                        .                 .
                       .                   .
                      .                     .
              **************            *****************                 
              *            *            *               *                 
              *   FooA     *            *    FooB       *                 
              *            *            *               *                 
              *            *            *               *                 
              **************            *****************                 
               .       .                           .                      
              .         .                           .                     
             .           .                           .                    
            .             .                           .                   
      **************   **************            **************           
      *            *   *            *            *            *           
      *            *   *            *            *            *           
      *  FooA_a    *   *   FooA_b   *            *  FooB_a    *           
      *            *   *            *            *            *           
      *            *   *            *            *            *           
      *            *   *            *            *            *           
      **************   **************            **************           
    
    那么,既然可以在FooA而不是FooBase中实现可空属性,为什么还要添加这些属性呢

    编辑

    所以,因为我在画东西,所以打败了我:你知道你可以像这样继承吗

                    ****************************                          
                    *                          *                          
                    *         FooBase          *                          
                    *                          *                          
                    ****************************                          
                        .                 .
                       .                   .
                      .                     .
              **************            *****************                 
              *            *            *               *                 
              *   FooA     *            *    FooB       *                 
              *            *            *               *                 
              *            *            *               *                 
              **************            *****************                 
               .       .                           .                      
              .         .                           .                     
             .           .                           .                    
            .             .                           .                   
      **************   **************            **************           
      *            *   *            *            *            *           
      *            *   *            *            *            *           
      *  FooA_a    *   *   FooA_b   *            *  FooB_a    *           
      *            *   *            *            *            *           
      *            *   *            *            *            *           
      *            *   *            *            *            *           
      **************   **************            **************           
    
    那么,既然可以在FooA而不是FooBase中实现可空属性,为什么还要添加这些属性呢

    编辑

    所以,我就这么做了,因为我在画东西:为什么要使用子类化?让抽象基类只拥有所有类型共享的方法。将其他方法拉入单独的类中,让需要该功能的类与提取的类协作。这将创建更好的内聚性和更松散的耦合。

    为什么要使用子类化?让抽象基类只拥有所有类型共享的方法。将其他方法拉入单独的类中,让需要该功能的类与提取的类协作。这将创建更好的内聚性和更松散的耦合。

    您可以发布一些代码吗?您可以从基类继承多个抽象类。我添加了一些示例代码,这只是一个概念示例。我想不出一个好的并行示例,也无法共享我的实际代码。很抱歉。你能发布一些代码吗?你可以从一个基类继承多个抽象类。我添加了一些示例代码,这只是一个概念示例。我想不出一个好的并行示例,也无法共享我的实际代码。抱歉。我知道你要去哪儿了。只是类A、B和C可能需要方法1和方法2,但只有B和C可能需要属性1。这些类有几十个属性,而共享属性和方法的类不属于足够大的组,不便于创建单独的类。换句话说,将部分共享的属性和方法分离为单独的类将导致大量的抽象类。这可能就是我要做的。(注意:此注释中的属性名称与我发布的代码不一致。)大量的类是一件好事,而不是坏事。这是你坚持单一责任原则的一个标志。是的,但是大量只代表6个不同物理对象的类更像是一种黑客行为,因为这些类中的许多类除了包含属性之外根本没有责任。我发现自己用“AllButClassA”这样的名字来命名这些类,因为没有其他描述性的方法来命名它们。这听起来不像是一个有责任感的班级。不是真的不同意你,只是说它感觉不太好——特别是在可读性和可维护性方面。也许吧。很难和一个朋友谈论这类事情