C#控制台应用程序之间的共享功能
我有两个控制台应用程序,查询和更新,共享一些功能。我想让这两个类继承自一个公共基类,但问题是,对于控制台应用程序,我必须具有static Main
函数。我目前有如下:C#控制台应用程序之间的共享功能
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
变量继承。我这样做的原因是,:
- 我可以在
ConsoleBase
定义protected static
方法,这些方法在派生类其他static
方法访问。 - 我可以沿着命令行参数传递给构造函数为
ConsoleBase
,做普通的东西,然后通过public
属性和方法在派生类再次访问的ConsoleBase
实例的参数。
所以在派生类中,我调用ConsoleBase
实例上的方法/属性的混合,例如,
_consoleBase.UseDebugMode()
以及调用继承的静态方法和访问在ConsoleBase
中定义的继承的常数,例如
printWarning(CONST_MSG_IN_BASE_CLASS);
我能以某种方式清理它吗?从一个类继承并保持该基类的一个实例来处理它是不是很糟糕?
请勿混用静态和实例方法是这样的。
考虑一下,将静态方法提供的责任分离到可以继承的不同类中。使非静态功能成为您在“更新”和“查询”中聚合并实例化的单独类。
另外,如果Update和Query是ConsoleBase的衍生物 - 为什么你需要聚集实例?
是的,你可以定义一个带有受保护的静态主类的基类,然后在继承类的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
}
}
我不认为你需要这样做。你为什么不简单地用命令行参数调用ConsoleBase.Main()函数?
有一个基类的实例是一个设计问题。
我希望命令行参数作为实例变量存储,因为它们直到运行时才会被知道。如果我在'ConsoleBase'中有一个'static'主函数,那么我将无法在'static'函数中访问这些实例变量。 – 2009-10-21 20:05:07
我喜欢将'ConsoleBase'中的静态方法与实例方法分开的想法。现在,如果我能想到这两个类的好名字...... – 2009-10-21 20:01:41