实例化抽象基类的静态方法中的几个派生类中的任何一个(取决于参数)

问题描述 投票:0回答:3

我一直在尝试寻找一种优雅的方法来避免在所有派生类中重复代码。在这一点上,我不确定最好的处理方法。

我想在基类中编写一个方法,该方法将实例化并使用其任何派生类,而在编写新的派生类时不必编辑该方法。

我曾尝试学习/使用通用方法,但开始认为我可能会为此应用程序陷入困境。我知道使用反射可能会很昂贵,并且由于此方法旨在处理数百甚至数千个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;
    }

我一直在尝试寻找一种优雅的方法来避免在所有派生类中重复代码。在这一点上,我不确定最好的处理方法。我想在基础中写一个方法...

c# instantiation dry derived-class base-class
3个回答
0
投票

Well…首先,我猜测“错误参数”是指Element派生类中的属性名称。例如,我猜测如果墙壁的长度为负数,则“长度”将是该特定墙壁的错误参数。其次,我猜您将要拥有大量的元素,例如图表中的许多墙壁和地板(以及其他东西)或其他内容。


0
投票

我假设您的BadParameter列表内容对于所有派生类都是相同的。如果此列表不常见,则没有必要在基本类中填充这些列表。根据这个假设,我可以建议您进行以下更改。


0
投票

您正在尝试从List<string>返回不同类型的参数,这是不可能的。 List<string>不知道哪个。您的基类不应具有这样的方法。那应该在您的实现中完成。 List<Element>可以包含任何继承Element基类的对象(Wall,Floor,..)。然后,您可以通过元素列表的OfType(DerivedType) IEnumerable方法选择要处理的类型。

以下几点可能会有所帮助:

© www.soinside.com 2019 - 2024. All rights reserved.