猿问

通用子类和类型推断-这是唯一的方法吗?

我最终在C#中使用了有关错误处理的功能方法的本文http://enterprisecraftsmanship.com/2015/03/20/functional-c-handling-failures-input-errors/


我有一个非泛型基类和一个继承该基类的泛型类。它们的目的是为“成功或失败”的想法建模-有时某些情况将返回“我成功”结果,而有时某些情况将返回“我成功,这就是结果”,尽管这与问题。


public class OperationResult

{

    public bool Successful { get; protected set; }

    public string FailureMessage { get; protected set; }

    public Exception Exception { get; protected set; }


    protected OperationResult() { }


    public static OperationResult Success()

    {

        Console.WriteLine(1);

        return new OperationResult()

        {

            Successful = true

        };

    }

    // not including failure part for clarity

}


public class OperationResult<T> : OperationResult

{

    public T Result { get; private set; }


    private OperationResult () { }


    public static OperationResult<T> Success(T result)

    {

        Console.WriteLine(2);

        return new OperationResult<T>()

        {

            Successful = true,

            Result = result

        };

    }

}

我现在遇到的情况是,由于两个方法的名称相同,因此编译器无法再推断类型,因此我需要指定类型。例如:


OperationResult.Success(); // Valid

OperationResult.Success("test"); // Invalid

OperationResult<string>.Success("test"); // Valid - wouldn't usually need to specify T

我忍不住觉得自己做错了什么,或者有更好的方法可以做到这一点。

  1. 有没有办法让编译器在不指定我的情况下仍然推断类型?

  2. 这是我第一次看到Thing<T>.SomeMethod()语法(不带方括号())-我要这样做是完全错误的吗?


子衿沉夜
浏览 138回答 2
2回答

拉莫斯之舞

看起来您尝试使用继承来实现两种不同类型的操作。如果我正确地理解了该应用程序,并且确实进行了编译,那么即使只有一个有效,您也可以在任何操作上调用任一Success方法。也就是说,一个操作将或不会返回结果。因此,您有2种不同的操作。编译器问题是设计问题的征兆。设计您的类,以便只能以正确的方式使用它们。也就是说,永远不要公开不应调用的方法。这里的目的是要有2个成功方法,但是只有一个有效。那是代码的味道。我认为问题出在这里对继承的不当使用。方法:抽象基类和2个继承的类。在基类中没有成功方法。2个类,一个公共接口和2个派生接口。在构造函数中注入通用功能。如果您重视单元可测试的代码,则最好使用后者。两者都是有效的,我稍后再做。

MYYA

这是您的操作方式:public class OperationResult{&nbsp; &nbsp; public bool Successful { get; protected set; }&nbsp; &nbsp; public string FailureMessage { get; protected set; }&nbsp; &nbsp; public Exception Exception { get; protected set; }&nbsp; &nbsp; protected OperationResult() { }&nbsp; &nbsp; public static OperationResult Success()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(1);&nbsp; &nbsp; &nbsp; &nbsp; return new OperationResult() { Successful = true };&nbsp; &nbsp; }&nbsp; &nbsp; public static OperationResult<T> Success<T>(T result)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(2);&nbsp; &nbsp; &nbsp; &nbsp; return new OperationResult<T>(result) { Successful = true };&nbsp; &nbsp; }}public class OperationResult<T> : OperationResult{&nbsp; &nbsp; internal OperationResult(T result) { Result = result; }&nbsp; &nbsp; public T Result { get; private set; }}您的所有三个成功代码行现在都可以正常工作。
随时随地看视频慕课网APP
我要回答