我有一个包含两个项目的解决方案,每个项目都生成一个由另一个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是MyActions
类DoJob
方法具有一些特定于Project1的额外位的项目。
现在这里是扭曲.. Project1最终将被废弃,它的dll将不再使用。我想以最好的方式编写代码,以确保没有重复的代码,所以我没有必要Project1停止后,在Project2中删除任何不需要的代码的任何修改。
我正在考虑使用继承并覆盖DoJob方法。如果它们的返回类型不同并且它们具有不同的输入参数,那将如何工作?也许将Project1的MyActions类中的一个参数推送到它的构造函数?我还想在Project1中添加Project2的MyActions类的链接。但不确定如何继续实施,而不是重复自己或可能在以后遇到无法预料的问题。有什么提示,建议吗?
答案 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
}
}
你明白了。