从方法返回接口类型的正确方法是什么?

时间:2012-02-07 18:46:40

标签: c# .net interface

好的说我有以下简单的课程:

public interface IResult<T>
{
    T Results { get; set;}
    string Message { get; set;}
}

public class Result<T> : IResult<T>
{
    T Results { get; set;}
    string Message { get; set;}
}

public class Result2<T> : IResult<T>
{
    T Results { get; set;}
    string Message { get; set;}
}

现在当我想调用一些方法来返回一个IResult时,哪种方法是正确的?

public class TestClass
{
    public bool TryDoSomething(out IResult<bool> result)
    {
        // Do stuff
        result.Message = "Out!";
        return true; // for example
    }

    public IResult<bool> DoSomething(IResult<bool> result)
    {
        // Do Stuff
        result.Message = "Sent in!";
        result.Result = true;
        return result;
    }

    public IResult<bool> DoSomething()
    {
        // Do Stuff
        IResult<bool> result = new Result<bool>();
        result.Message = "I'm a Result!";
        result.Result = true;
        return result;
    }
}

现在说我实际上想要一个Result2,最好是创建它并将其作为参数(方法#1或#2)发送或者创建一个新的结果但是将其重新设置为IResult然后重命名为Result2,如方法# 3?

public class GetResults
{
    public void GetResults()
    {
        Result2<bool> results = new Result2<bool>();
        if (TryDoSomething(out results))
        {
            Debug.WriteLine(results.Message);
        }
        results = DoSomething(results);
        if (results.Result) Debug.WriteLine(results.Message);
        results = DoSomething();
        if (results.Result) Debug.WriteLine(results.Message);
    }
}

因此,最好在Method中创建我的接口实现,还是将其作为参数发送?

2 个答案:

答案 0 :(得分:3)

你应该只使用out参数作为最后的手段 - 除非真的想要从同一个方法中有效地返回两个值,并且你有充分的理由不封装他们在一起(或使用Tuple),我绝对不会建议第一种方法。 (bool意味着什么?)

如果目标是操纵现有对象,那么第二种方法是合适的 - 但如果目标是创建结果(这是更常见的,IMO )然后第三种方法是最合适的方法。

当我们没那么多时,很难给出具体的建议,但我个人赞成实用的不可变类型,无论如何都排除了第二种方法。

关于“我真的想要一个Result2” - 想要一个Result2的问题?调用代码,还是返回结果的方法?通常,如果您正在创建结果,那么“创建”代码更适合了解它想要使用的实现。

答案 1 :(得分:1)

从你的评论到Jon的答案之后,调用者可以指定所需的类型而不创建对象,假设该类具有公共无参数构造函数:

public TResult DoSomething<TResult, U>() where TResult : IResult<U>, new()
{
    // Do Stuff     
    TResult result = new TResult();     
    result.Message = "I'm a Result!";     
    result.Result = true;     
    return result;     
}

用法:

Result<bool> result1 = DoSomething<Result<bool>, bool>();
Result2<bool> result2 = DoSomething<Result2<bool>, bool>();