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

本文关键字:方法 是什么 接口类型 返回 | 更新日期: 2023-09-27 18:22:51

好吧,假设我有以下简单的类:

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)更好,还是创建一个新的Result但将其重新命名为IResult,然后像方法#3中那样发送到Result2更好?

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

那么,是在方法中创建接口实现更好,还是将其作为参数发送?

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

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

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

当我们没有什么可做的时候,很难给出具体的建议,但就我个人而言,我喜欢在可行的情况下使用不可变类型,这无论如何都排除了第二种方法。

就你关于"我真的想要Result2"的问题而言,什么想要Result2?调用代码,还是返回结果的方法?通常,如果您正在创建结果,那么"创建"代码更适合知道它想要使用哪个实现。

从您的注释到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>();