从方法返回接口类型的正确方法是什么
本文关键字:方法 是什么 接口类型 返回 | 更新日期: 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>();