2012-02-07 81 views
0

好了说,我有以下简单的类:什么是从方法返回接口类型的正确方法?

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

现在说我其实是想一个结果2,是能够更好地创建并发送过来的参数(方法#1和#2),或创建一个新的结果,但重铸它作为IResult再到结果2如在方法#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中创建接口实现还是作为参数发送它更好?

+0

顺便说一句,你不需要'out'参数,这些工作与通常只传递参数有些不同。 – BoltClock 2012-02-07 18:50:28

+0

“结果”和“结果2”必须将它们从接口实现的属性声明为“public”。另外,'TestClass.TryDoSomething'必须在使用它之前分配'result'(因为它被声明为“out”)。 – 2012-02-07 18:53:52

+1

@BoltClock:如果点的值是由被调用的方法创建的,你*需要'out'参数。 (在这种情况下,'TryDoSomething'不会首先编译......) – 2012-02-07 18:54:24

回答

3

,才应使用out参数作为最后的手段 - 除非你真的有效地从同一个方法返回两个值,并且你已经有了一个很好的理由不来封装在一起(或使用Tuple)我绝对不会建议第一种方法。 (什么是该bool意味着是)

如果目的是操纵现有的对象,那么第二种方法是合适的 - 但如果目的是创建结果(这是更常见的,国际海事组织),那么第三种方法是最合适的。

我们很难提供具体的建议,但我个人认为不可改变的类型在可行的地方,这就排除了第二种方法。

在你的问题而言约“其实我是想一Result2” - 什么想要一个Result2?调用代码或返回结果的方法?通常,如果您要创建一个结果,那么对于“创建”代码来说,它更适合知道要使用哪个实现。

+0

我试图让示例尽可能简单,所以这就是为什么它如此基本。对于“我实际上想要一个Result2 '”,我的意思是如果我使用方法#3,它总是会创建一个结果''作为'IResult '返回,然后转换为'Result2 '那开销不好?或者那可以吗?我应该这样做还是创建我的'Result2 '并通过方法#2发送? 'bool'只是一个简单的例子,可以检查这些方法是否成功,它可以是一个“字符串”或其他类型的对象,这个想法是不需要多个' Result' classes – John 2012-02-07 19:09:14

+0

@John:如果你调用一个被声明只返回一个接口的方法,你不应该依赖于使用哪个实现。检查一个方法是否成功很少是你应该明确做的事情 - 失败通常被异常表示。这正是没有提供*具体*例子的问题... – 2012-02-07 19:20:24

+0

是的,我不是依赖于某种返回类型,只是试图展示一个“它创建这个具体类型,但然后改变它”。我一直这样做,只是在质疑自己,看看这是否是好方法,或者如果我应该先创建具体类型而不是使用我的方法。非常感谢你的回答,我已经阅读了很多你在这里的回复,所以很荣幸你回复了我的问题:)。我的'IResult '被创建为Tuple的替代品,所以我不必处理随机的元组对象。 – John 2012-02-07 19:31:10

1

从乔恩的回答您的评论继,主叫方可以指定需要什么类型的,而无需创建对象,假设类有一个公共的无参数的构造函数:

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>(); 
+0

有趣的是,谢谢:),我可以在哪里找到这方面的一些文档? – John 2012-02-07 19:53:09

+0

@John http://msdn.microsoft.com/en-us/library/sd2w2ew5(v=vs.100).aspx是'new()'约束的文档。 – phoog 2012-02-07 23:40:11

相关问题