Как правильно вернуть тип интерфейса из метода? - PullRequest
0 голосов
/ 07 февраля 2012

Хорошо, скажите, что у меня есть следующие простые классы:

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, а затем в 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);
    }
}

Так что лучше создать мою реализацию интерфейса в методе или отправить ее в качестве параметра?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Вы должны использовать только out параметры в качестве крайней меры - если только вы действительно не хотите эффективно возвращать два значения из одного и того же метода, и у вас есть веская причина не объединять их вместе (или используйте Tuple), я бы точно не предложил первый подход.(Для чего предназначен bool?)

Если цель состоит в манипулировании существующим объектом, тогда уместен второй метод - но если целью является создать результат (что более распространено, IMO), чем третий подход, который является наиболее подходящим.

Трудно дать конкретный совет, когда у нас так мало работы, но лично япредпочитайте неизменные типы там, где это целесообразно, что в любом случае исключает второй метод.

С точки зрения вашего вопроса о "Я действительно хочу Result2" - что хочет Result2?Вызывающий код или метод, возвращающий результат?Обычно, если вы создаете результат , тогда «создающему» коду лучше знать, какую реализацию он хочет использовать.

1 голос
/ 07 февраля 2012

Исходя из вашего комментария к ответу Джона, вызывающая сторона может указать, какой тип требуется, не создавая объект, при условии, что класс имеет открытый конструктор без параметров:

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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...