以正确的方式做干事

时间:2012-11-23 15:27:09

标签: c# .net oop

我有一个包含两个项目的解决方案,每个项目都生成一个由另一个Windows应用程序使用的单独的dll。每个项目都有一个名为MyActions的类,只有一个方法,如此

PROJECT1

   public class MyActions
    {
        public SomeTypeA DoJob(string str1, string str2)
        {
        }
    }

项目2

   public class MyActions
    {
        public SomeTypeB DoJob(string str1)
        {
        }
    }

这两个类的两种返回类型如下所示

    public class SomeTypeA 
    {
         public string stringA { get; set; }
         public int someInt { get; set; }
    }


public class SomeTypeB 
{
     public string someStringA { get; set; }

}

这些单独项目的两个类中的方法DoJob几乎有80%的代码是相同的。 Project1是MyActionsDoJob方法具有一些特定于Project1的额外位的项目。 现在这里是扭曲.. Project1最终将被废弃,它的dll将不再使用。我想以最好的方式编写代码,以确保没有重复的代码,所以我没有必要Project1停止后,在Project2中删除任何不需要的代码的任何修改。

我正在考虑使用继承并覆盖DoJob方法。如果它们的返回类型不同并且它们具有不同的输入参数,那将如何工作?也许将Project1的MyActions类中的一个参数推送到它的构造函数?我还想在Project1中添加Project2的MyActions类的链接。但不确定如何继续实施,而不是重复自己或可能在以后遇到无法预料的问题。有什么提示,建议吗?

3 个答案:

答案 0 :(得分:3)

如果(并且仅当)两个类中的两个方法的参数和返回类型实际上不同,则将代码逐行相同,假设它是一个块,并且只创建一个新静态类中的静态方法,传递公共代码所需的参数。

如果有多个块,只需要多个方法。

从每个原始方法中适当地调用这些方法。

如果你想在这些类之间创建一个层次关系,你应该只在这样做时才这样做,只需让它们继承一个公共类型,并使上面的方法成为该公共类的受保护方法。然后从原始方法中调用它。

答案 1 :(得分:1)

public class MyActions
{
    public ISomeType DoJob(ISomeParam item)
    {
    }
}

public class SomeTypeA : ISomeType 
public class SomeTypeB : ISomeType 

答案 2 :(得分:1)

你对继承的看法很好。从您在考虑让项目1继承自项目2的行之间的阅读中的问题。这是可能的,但可能不是最佳解决方案。这是我的建议。

为两个项目扩展的MyActions创建一个超类。在这个类中,您可以移动在两个项目中共享的所有代码(方法的80%代码)。然后,每个项目中MyAction中的特定实现将根据需要实现DoJob方法,并使用超类中提供的方法。

一旦废弃项目1,就不会对项目2的代码进行任何更改。你最终得到了一个超级课程,但在这种情况下你真的不需要了。但是你不会在任何地方重复。

我还不熟悉java和C#之间的确切差异,如果有差异,请耐心等待。这就是java中的代码。

abstract class AbstractMyActions {

    protected SomeType commonMethodForBothProjects() {
        ...
    }
}

public class MyActionsA extends AbstractMyActions {

     public SomeType doJob(SomeParameter ..., SomeParameter ...) {
         $this->commonMethodForBothProjects();
         // Additional steps
     }
}

你明白了。