具有相同方法签名的不同返回类型(关注可用性)

时间:2018-03-15 12:43:38

标签: c#

我已经搜索了答案并通过大量帖子进行了解析,但我不太确定我对我的问题有充分的理解或解决方案。

我正在编写一个与CodedUI和我公司的应用程序一起使用的框架。在某些情况下,向我们的应用程序中的特定字段添加数据可以返回多个消息框中的一个。我试图找出最好的解决方案,使编写测试用例尽可能简单。编写测试用例的测试人员可能对C#没有很强的理解,所以我试图简单地使用框架。我还想避免让测试人员在测试用例中使用。

我已经想到了几种解决方案,但从最终用户的角度来看,对我来说没什么感觉。

首先,我可以使用void返回类型,让测试人员创建一个预期的消息框实例。这里的问题是我将实例化留给了测试人员。这可能是最好的解决方案,但我正试图卸载它,让框架担心实现细节。

public class Framework
{
    public void AddData(string data)
    {
        //...
    }
}

public class TestClass
{
    public void TestCase()
    {
        var framework = new Framework();
        framework.AddData("some data");
        var message = new Message1();
    }
}

我的第二个选择是使用泛型。我可以为所有消息框设置一个基类,让测试人员添加他们想要的内容。这似乎是合理的,而且比第一个更好的解决方案,但我在这里有两个问题。首先,有时(尽管不常见)Message的实例化需要特定的构造函数数据,因此AddData()的框架端实现可能需要多个方法(即AddData1(),AddData2()...)。其次,我担心为最终用户添加泛型。

public class Framework
{
    public T AddData<T>(string data) where T : MessageBox, new()
    {
        return new T();
    }
}

public class TestClass
{
    public void TestCase()
    {
        var framework = new Framework();
        var message = framework.AddData<Message1>("some data");
    }
}

最后,当然,我可以使用具有特定返回类型的多种方法。我讨厌这个解决方案,因为它感觉很难看。

public class Framework
{
    public Message1 AddData1(string data)
    {
        return new Message1();
    }

    public Message2 AddData2(string data)
    {
        return new Message2();
    }
}

public class TestClass
{
    public void TestCase()
    {
        var framework = new Framework();
        var message1 = framework.AddData1("some data");
        var message2 = framework.AddData2("some data");
    }
}

理想情况下,我希望有一种方法可以使用多种返回类型。我知道它不是本机支持的,但我不确定如何实现解决方法(如果可能的话)。像这样:

public class Framework
{
    public Message1 AddData(string data)
    {
        return new Message1();
    }

    public Message2 AddData(string data)
    {
        return new Message2();
    }
}

public class TestClass
{
    public void TestCase()
    {
        var framework = new Framework();
        var message1 = framework.AddData("some data");
        var message2 = framework.AddData("some data");
    }
}

当然,我对任何我没有想到的选择持开放态度。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我会选择Generics选项。

您可以通过添加Func<T>参数作为工厂方法来解决您的第一个问题:

public class Framework
{
    public T AddData<T>(string data, Func<T> factory) where T : MessageBox 
    {
        T returnValue = factory();
        returnValue.data = data;
        return returnValue;
    }
}

用法:

var normalMessageBox = framework.AddData("data", () => new NormalMessageBox());

var specialMessageBox = framework.AddData("data", () => new SpecialMessageBox(1, "title"));

然而,这可能会让你的第二个问题变得更大 - 因为你说它的目的是被那些没有那么强大的c#技能的人使用。 这可以通过良好的文档和代码示例来解决。

See a live demo on rextester.