1

我需要一些关于为一个应用程序构建类的建议,该应用程序模拟 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?
    }
}
4

4 回答 4

2

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

细节很少,但听起来你最好在你的类层次结构中拥有一个单独的“层”。

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

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

于 2012-07-16T15:49:20.253 回答
1

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

  1. 包含其他公共属性的中间子类或
  2. 声明一个实现公共属性的接口,并让这些类实现它。
于 2012-07-16T15:49:58.460 回答
1

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

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

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

编辑
所以Reed CopseyFelice Pollano打败了我,因为我在画东西:P

于 2012-07-16T15:51:36.540 回答
1

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

于 2012-07-16T15:52:00.410 回答