适当的类结构c#

时间:2012-07-16 15:45:54

标签: c# oop inheritance

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

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

  • 所有子类将使用的属性和方法,已经实现。
  • 某些子类将使用的方法标记为抽象,在子类中实现。
  • 某些子类将使用的属性标记为可为空,以便不使用该属性的子类可以为null。

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

编辑 - 添加代码示例

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?
    }
}

4 个答案:

答案 0 :(得分:2)

  

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

没有什么细节,但听起来你最好在你的班级层次结构中有一个单独的“层”。

类3,4和5可以从一个单独的抽象类派生而来,它继承了你的“基类”。这样就不需要第1类和第2类在其中使用“未使用”的方法和属性。

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

答案 1 :(得分:1)

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

  1. 包含其他常见属性OR
  2. 的中间子类
  3. 声明一个实现公共属性的接口,并让这些类实现它。

答案 2 :(得分:1)

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

                ****************************                          
                *                          *                          
                *         FooBase          *                          
                *                          *                          
                ****************************                          
                    .                 .
                   .                   .
                  .                     .
          **************            *****************                 
          *            *            *               *                 
          *   FooA     *            *    FooB       *                 
          *            *            *               *                 
          *            *            *               *                 
          **************            *****************                 
           .       .                           .                      
          .         .                           .                     
         .           .                           .                    
        .             .                           .                   
  **************   **************            **************           
  *            *   *            *            *            *           
  *            *   *            *            *            *           
  *  FooA_a    *   *   FooA_b   *            *  FooB_a    *           
  *            *   *            *            *            *           
  *            *   *            *            *            *           
  *            *   *            *            *            *           
  **************   **************            **************           

那么为什么要在FooA而不是FooBase中实现它们时添加可空属性呢?

修改
所以Reed CopseyFelice Pollano打败了我,因为我画的是东西:P

答案 3 :(得分:1)

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