我有两个独立的类,它们都包含相同的方法名称(启动,验证等)。
但是,方法所期望的参数在两个类之间是不同的。
例如......我有类似的东西:
public static class A
{
public static void Start(string a, string b) ...implementation inside of it
public static void Validate (string a, FileInfo b) ...implementation inside of it
}
public static class B
{
public static void Start (string a) ...implementation inside of it
public static void Validate(string a, string h FileInfo b, string[] c) ...implementation inside of it
}
有没有办法用更好的设计pov代码重构这个?这两种方法也共享一些共同的代码。
我试图创建一个接口(我必须从两个类中删除静态)但最后它是一个混乱的意义上我必须实现A和B类中的4个方法中的每一个,这不是什么我在寻找。
如果我能对此有所了解,那将会很棒。我需要的接口是什么?也许和抽象类?还有别的吗?
答案 0 :(得分:1)
在这种情况下,我将把Validate函数的输入参数分组到一个新类
中public static class Params {
public string a,
public FileInfo b
}
然后将此课程扩展到
public static class ExtendedParams extends Params {
public string h,
public string[] c
}
然后我原来的A,B类可以使用相同的界面
interface iAB {
public Start(string a, string b)
public Validate(Params c)
}
每个类都会以不同的方式实现Start和Validate,但是B类会将ExtentedParams视为输入,因此您必须将其强制转换为ExtendedParams来访问额外的字段。
如果您需要更简洁的方法,根据您的对象的语义,Params对象应该公开一个接口,其中包含您要对它们执行的操作(或它们的数据),并让它们处理逻辑。例如(基于前面的示例):
public static class Params {
public string a,
public FileInfo b,
public void validate()
}
public static class ExtendedParams extends Params {
public string h,
public string[] c,
public void validate() // implements its own validation
}
最后,它实际上取决于你自己的系统逻辑,但那将是我要遵循的方向。
答案 1 :(得分:0)
有一种更简单的方法,IMO。这两个类都是静态的,你解开了,因为你想要一个基于接口或基于继承的解决方案。一种更简单的方法可能是在一个类中重载方法。
这意味着您可以将方法折叠为一个具有多个重载方法的静态类。这将使您的重构更简单,并允许您在“统一”类中更轻松地重用公共代码。
所以,像这样:
public static class AB // combined
{
public static void Start(string a, string b) ...implementation inside of it
public static void Validate (string a, FileInfo b) ...implementation inside of it
public static void Start (string a) ...implementation inside of it
public static void Validate(string a, string h FileInfo b, string[] c) ...implementation inside of it
private static string SomeCommonFunctionality(string a, string h) ...implementation
}
答案 2 :(得分:0)
使用可选参数。这取决于您的代码正在做什么,这是否是一个可行的解决方案。
public static class B
{
public static void Start (string a, string b = string.empty)
{
//common code
if (b != string.empty)
{
var s = SomethingSpecific(string y)
}
//common code
}
public static void Validate(string a, string h FileInfo b, string[] c = null)
{
}
private static string SomethingSpecific(string y)
{
//Do some custom logic here
}
}