在典型的winform program.cs中包含入口点:
static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // the code goes on
我想创建自己的框架,隐藏与应用程序域无关的所有内容的管道,所以我希望能够在另一个名称空间中创建基类类似
namespace MyFramework
{
public partial class Program
{
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// the code goes on
然后在我的应用程序命名空间program.cs继承上面的那个,以便我可以摆脱Application.EnableVisualStyles并只写这样的东西
static void Main(string[] args): base()
{
//only app domain code
如果从两个类中删除静态attrib但是我无法从主入口方法中删除静态,那么我可以从基类继承,所以我无法真正完成。
我不想使用后面的代码隐藏铅笔,因为我需要将其移植到其他没有代码的语言。
有没有办法用OOP实现这个简单合法的目标(继承与否,静态与否),而不使用一些大的外部框架?
例如,有没有办法可以将主入口点委托给框架命名空间中的另一个类?
答案 0 :(得分:1)
您的入口点必须为static
。
答案 1 :(得分:1)
执行此操作的最佳方法是使您的Program
类成为非静态类,该类派生自另一个类(将完成您所需的所有工作的类)。您可以在基类中声明static
方法,并在Application.EnableVisualStyles();
之前调用该方法。
相同的代码将是这样的:
public class Program : MyBaseClass
{
[STAThread]
static void Main()
{
MethodToDoAllTheHardWork();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
public class MyBaseClass
{
public static void MethodToDoAllTheHardWork()
{
}
}
在static
中声明MyBaseClass
方法的原因是因为Main
方法必须是static
方法,并且您只能调用相同的静态成员或基类。
答案 2 :(得分:1)
入口点方法需要是静态的,因此使用继承(如您所知)将无法工作,但可以通过多种方式执行您想要执行的操作。例如,
namespace MyFramework
{
public static class AppStarter
{
static EventHandler AppStarting;
[STAThread]
static void Run(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// the code goes on
if (null != AppStarting)
{
AppStarting(null, EventArgs.Empty);
}
现在,您可以使用它
public partial class Program
{
[STAThread]
static void Main(string[] args)
{
AppStarter.AppStarting += new EventHandler(MyStartupCode);
AppStarter.Run(args);
另一种基于继承的变体将是
namespace MyFramework
{
public abstract class Application
{
protected abstract void OnBeforeInit();
protected abstract void OnAfterInit();
protected void Run(string[] args)
{
OnBeforeInit();
// Do initialization
OnAfterInit();
...
}
您将按如下方式使用它:
public class MyApplication: MyFramework.Application
{
[STAThread]
static void Main(string[] args)
{
(new MyApplication()).Run(args);