2

我再次来这里寻求帮助。我正在编写我的第一个“类似真实”的应用程序来练习我学到的东西,但我不确定我的方法。我会尽力解释它,因为我的英语允许我这样做。

应用程序由基抽象类和从该基继承的三个类组成。

abstract class BaseClass
{
     // Some stuff...

     // This method is used in all classes. It gets whole adb output
     // and returns it as a string for future formating
    protected string ProcessAdbCommand(string command)
    {
        try
        {
            _processInfo.Arguments = command;
            Process adbProcess = Process.Start(_processInfo);
            adbProcess.WaitForExit();
            return adbProcess.StandardOutput.ReadToEnd();
        }
        catch (Exception e)
        {
            WriteToLog(e.Message);
            return null;
        }            
    } 
}

在 ProcessAdbCommand 返回输出后,我将根据需要调用另一个处理输出的方法。原则总是一样的——格式化输出并根据输出做出一些有用的思考。

现在我想澄清一下,负责输出处理的方法需要在每个继承的类中。但问题是在非常类中它返回不同的值类型(布尔值、IDevice 列表和字符串)

我在这里挣扎。首先,我想让它成为受保护的抽象。有人想像

abstract class BaseClass
{
     // Some stuff...

    // Same as above
    protected string ProcessAdbCommand(string command)
    {
            //Same as above
    }

    //Method which will be implemented in every inherited class differently
    protected bool|List<IDevice>|string ProcessAdbOutput(string adbOutput)
    {
            //Method implementation

            return bool|List<IDevice>|string
    } 
}

但正如我发现的那样,不可能覆盖返回类型。而且因为方法总是只在类内部使用,我看不出有理由使用接口“强制”它。

一段时间后,我决定忘记在派生类中强制实现,而是根据需要简单地编写它们。但你认为这是“合法”的做法吗?您将如何在“现实世界”应用程序中解决这样的问题?有什么我仍然缺少的东西,还是我的方法完全错误?谢谢你。

挣扎的绿角。

4

1 回答 1

1

一种可能的方法是使抽象基类通用并接受一个T参数,该参数也可以是您的ProcessAdbOutput方法的输出。然后,您创建该方法abstract以确保任何派生类型都必须实现它:

public abstract class BaseClass<T>
{
    protected string ProcessAdbCommand(string command)
    {
        return string.Empty;
    }

    public abstract T ProcessAdbOutput(string result);
}

public class DerivedClass : BaseClass<IList<IDevice>>
{
    public override IList<IDevice> ProcessAdbOutput(string result)
    {
        return new List<IDevice>();
    }
}
于 2015-09-12T17:21:52.523 回答