我有两个控制台应用程序,即查询和更新,它们共享一些功能。我想让这两个类继承自一个公共基类,但问题是,对于一个控制台应用程序,我必须有一个static Main
函数。我目前拥有以下内容:
namespace Utils
{
public class ConsoleBase
{
protected const int ERROR_EXIT_CODE = 1;
protected static void printWarning(string msg) {...}
public ConsoleBase(IEnumerable<string> args) { ... }
...
namespace Update
{
class Update : ConsoleBase
{
private static ConsoleBase _consoleBase;
public static void Main(string[] args) { ... }
...
namespace Query
{
class Query : ConsoleBase
{
private static ConsoleBase _consoleBase;
public static void Main(string[] args) { ... }
...
对于我而言,从ConsoleBase
继承并且在每个派生类中将其实例作为static
变量似乎是一个设计问题。我这样做的原因是:
protected static
中定义ConsoleBase
个方法,这些方法可以在派生类中使用其他static
方法。ConsoleBase
的构造函数,执行常见的操作,然后通过public
实例ConsoleBase
的属性和方法在派生类中再次访问参数1}}。因此,在派生类中,我在ConsoleBase
的实例上混合了对方法/属性的调用,例如
_consoleBase.UseDebugMode()
调用继承的静态方法并访问ConsoleBase
中定义的继承常量,例如
printWarning(CONST_MSG_IN_BASE_CLASS);
我能以某种方式清理它吗?从类继承以及保留该基类的实例来处理它是不是很糟糕?
答案 0 :(得分:1)
是的,您可以使用受保护的静态main定义基类,然后从继承类的Main方法中调用BaseClass.Main(args)。
这个syntex更正确:
public class BaseApp
{
public static Main(String[] args)
{
// TODO: ...
}
}
public class App1 : BaseApp // Same for App2
{
// There is no need to keep a reference of the base class
// if you are accessing static methods only
public static Main(String[] args)
{
BaseApp.Main(args); // Access via class, not via instance
}
}
答案 1 :(得分:1)
不要混用像这样的静态和实例方法。
考虑一下,将静态方法提供的责任分离到可以继承的不同类中。使非静态功能成为您在Update和Query中聚合和实例化的单独类。
此外,如果Update和Query是ConsoleBase的衍生物 - 为什么需要聚合实例?
答案 2 :(得分:0)
我认为你不需要这样做。为什么不用命令行参数调用ConsoleBase.Main()函数?
拥有基类的实例是一个设计问题。