如何在这里没有重复行的代码?

问题描述

 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();
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...