我一直在尝试寻找一种优雅的方法来避免在所有派生类中重复代码。在这一点上,我不确定最好的处理方法。
我想在基类中编写一个方法,该方法将实例化并使用其任何派生类,而在编写新的派生类时不必编辑该方法。
我曾尝试学习/使用通用方法,但开始认为我可能会为此应用程序陷入困境。我知道使用反射可能会很昂贵,并且由于此方法旨在处理数百甚至数千个Element,因此似乎是个坏主意。
现在,我正在考虑尝试以某种方式将类本身作为参数传递……也许。对我来说,这也不是很正确。
我愿意进行研究,但是很乐意为我指明正确的方向。
这里是我所拥有的简要版本...
基类:
public abstract class Element
{
public string ElementName { get; }
public List<string> BadParameters { get; set; } = new List<string>();
//Constructor
public Element(string name)
{
ElementName = name;
}
//The method in question---
public static List<string> GetBadParameters(//derived class to instantiate)
{
var elem = new //derived class();
return elem.BadParameters;
}
}
派生类1:
public class Wall : Element
{
public double Length { get; set; }
public bool LoadBearing { get; set; }
//Constructor
public Wall(string name): base(name)
{
SetBadParameters();
}
public void SetBadParameters()
{
BadParameters = //A wall specific way of setting bad parameters
}
}
派生类2:
public class Floor : Element
{
public double Area { get; set; }
public double Slope { get; set; }
//Constructor
public Floor(string name): base(name)
{
SetBadParameters();
}
public void SetBadParameters()
{
BadParameters = //A floor specific way of setting bad parameters
}
}
实施:
public class Implementation
{
public List<string> GetAllBadElementParameters()
{
List<string> output = new List<string>;
List<string> badWalls = GetBadParameters(//Wall class)
List<string> badFloors = GetBadParameters(//Floor class)
output = output.AddRange(badWalls).AddRange(badFloors);
return output;
}
}
编辑-进行澄清:
实际内容
public List<string> BadParameters
没关系。错误的参数,如何以及为什么它们是错误的都是无关紧要的。
我想完成的工作是避免在派生类中定义方法“ GetBadParameters()”,因为此方法对于所有派生类都是完全相同的。
只有从一个派生类变为另一个派生类的“ BadParameter”基类属性的填充。
编辑2-我对基类中通用方法的尝试:
我知道这行不通,但可以传达我想发生的事情。
public static List<string> GetAllBadParameters<T>(List<string> names) where T : ANY DERIVED CLASS, new()
{
List<string> output = new List<string>();
foreach (string name in names)
{
var elem = new T(name);
foreach (string badParameter in elem.BadParameters)
{
output.Add(badParameter);
}
}
return output;
}
我一直在尝试寻找一种优雅的方法来避免在所有派生类中重复代码。在这一点上,我不确定最好的处理方法。我想在基础中写一个方法...
Well…首先,我猜测“错误参数”是指Element派生类中的属性名称。例如,我猜测如果墙壁的长度为负数,则“长度”将是该特定墙壁的错误参数。其次,我猜您将要拥有大量的元素,例如图表中的许多墙壁和地板(以及其他东西)或其他内容。
我假设您的BadParameter列表内容对于所有派生类都是相同的。如果此列表不常见,则没有必要在基本类中填充这些列表。根据这个假设,我可以建议您进行以下更改。
您正在尝试从List<string>
返回不同类型的参数,这是不可能的。 List<string>
不知道哪个。您的基类不应具有这样的方法。那应该在您的实现中完成。 List<Element>
可以包含任何继承Element
基类的对象(Wall,Floor,..)。然后,您可以通过元素列表的OfType(DerivedType)
IEnumerable方法选择要处理的类型。
以下几点可能会有所帮助: