如何解决如何在这里没有重复行的代码?
Public Class Classthree
{
ClassOne obj = null; //ClassOne:Classthree
Classtwo obj2 = null; //Classtwo:Classthree
public List<Query> GetQueries(string source)
{
List<Query> Queries = new List<Query>();
if (source.Equals("ABCD"))
{
obj = new ClassOne();
AddQuerie(Queries,obj.GetQuery1());
AddQuerie(Queries,obj.GetQuery2());
AddQuerie(Queries,obj.GetQuery3());
AddQuerie(Queries,obj.GetQuery4());
AddQuerie(Queries,obj.GetQuery5());
AddQuerie(Queries,obj.GetQuery6());
}
else
{
obj2 = new Classtwo();
AddQuerie(Queries,obj2.GetQuery1());
AddQuerie(Queries,obj2.GetQuery2());
AddQuerie(Queries,obj2.GetQuery3());
AddQuerie(Queries,obj2.GetQuery4());
AddQuerie(Queries,obj2.GetQuery5());
AddQuerie(Queries,obj2.GetQuery6());
}
return Queries;
}
}
如何删除AddQuerie方法的重复项。有没有可能编写单个方法,但是它必须访问ClassOne或Classtwo的相应对象?
注意:ClassOne GetQueryX()与Classtwo GetQueryX()不同
方法从一类到另一类完全不同
解决方法
方法1:使用界面
public interface IMultiQueryable
{
string GetQuery1();
string GetQuery2();
string GetQuery3();
string GetQuery4();
string GetQuery5();
string GetQuery6();
}
public class ClassOne : IMultiQueryable
{
public string GetQuery1() => "";
public string GetQuery2() => "";
public string GetQuery3() => "";
public string GetQuery4() => "";
public string GetQuery5() => "";
public string GetQuery6() => "";
}
public class ClassTwo : IMultiQueryable
{
public string GetQuery1() => "";
public string GetQuery2() => "";
public string GetQuery3() => "";
public string GetQuery4() => "";
public string GetQuery5() => "";
public string GetQuery6() => "";
}
用法
public class ClassThree
{
IMultiQueryable obj = null;
public List<Query> GetQueries(string source)
{
List<Query> Queries = new List<Query>();
if (source.Equals("ABCD"))
{
obj = new ClassOne();
}
else
{
obj = new ClassTwo();
}
AddQuerie(Queries,obj.GetQuery1());
AddQuerie(Queries,obj.GetQuery2());
AddQuerie(Queries,obj.GetQuery3());
AddQuerie(Queries,obj.GetQuery4());
AddQuerie(Queries,obj.GetQuery5());
AddQuerie(Queries,obj.GetQuery6());
return Queries;
}
}
方法2:使用dynamic
public class ClassThree
{
public List<Query> GetQueries(string source)
{
List<Query> Queries = new List<Query>();
dynamic obj = null;
if (source.Equals("ABCD"))
{
obj = new ClassOne();
}
else
{
obj = new ClassTwo();
}
AddQuerie(Queries,obj.GetQuery6());
return Queries;
}
}
,
您可以使用add方法将GetQueryX()方法放入列表中(此代码将不可避免地具有重复的结构),然后使用foreach循环在其中对列表中的每个条目进行AddQuerie()。这样,您只需为每个ClassOne和ClassTwo调用一次AddQuerie()
,您可以通过多种方法来实现这一目标,但是我不禁要问,您要问的问题是否是由于较早的设计决定而导致您遇到此问题。
此外,您有一条评论ClassOne obj = null; //ClassOne:ClassThree
,这使我相信ClassOne和ClassTwo继承自ClassThree?除了消除重复之外,如果您进一步详细了解要完成的工作,这可能会有所帮助。
如果ClassOne和ClassTwo确实继承自ClassThree,则可以避免字符串完全切换。
public List<Query> GetQueries(string source)
{
List<Query> Queries = new List<Query>();
if (source.Equals("ABCD"))
{
obj = new ClassOne();
AddQuerie(Queries,GetQuery1());
AddQuerie(Queries,GetQuery2());
AddQuerie(Queries,GetQuery3());
AddQuerie(Queries,GetQuery4());
AddQuerie(Queries,GetQuery5());
AddQuerie(Queries,GetQuery6());
}
return Queries;
}
但是,除此之外,似乎内部查询应该只是在一个列表中,您可以在其中一次获得一个查询。
public interface ClassThree
{
List<Query> GetQueries();
}
public class ClassOne
{
private List<Query> queries;
public List<Query> Queries
{
get => queries;
private set => queries = value;
}
//...ways to populate the query list
//You could even retain the named functions if needed
public Query GetQuery1()
{
return queries[0];
}
}
或者更进一步,并使用工厂类创建您的Query容器类,并完全跳过继承。
注意:ClassOne GetQueryX()与ClassTwo GetQueryX()不同
方法从一类到另一类完全不同
在继承的类中,方法主体是不同的。它们必须都具有相同的签名。您还说他们的名字不一样吗?
更多详细信息将有助于提供更好的解决方案。
,解决这个问题的最佳方法是使两个类都实现一个IGetQuery
接口,就像其他人指出的那样。
但是,如果您无法执行此操作,则另一种方法是使用反射来调用所需的方法。
假设您所有的AddQuerie()
方法都是向Query
添加List<Query>
,则可以这样编写GetQueries()
方法:
public List<Query> GetQueries(string source)
{
Query GetQuery(object obj,int n)
{
var method = obj.GetType().GetMethod("GetQuery" + n);
return (Query)method.Invoke(obj,null);
}
if (source.Equals("ABCD"))
{
obj = new ClassOne();
return Enumerable.Range(1,6).Select(n => GetQuery(obj,n)).ToList();
}
else
{
obj2 = new ClassTwo();
return Enumerable.Range(1,6).Select(n => GetQuery(obj2,n)).ToList();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。