关于单例模式窗体的共通------------- 【在线等】

时间:2021-03-24 20:47:47
我有一MDI父窗体上面有很多按钮用于打开 其他子窗体 代码如下:
父窗体

        private void toolStripMenuItem3_Click(object sender, EventArgs e)
        {
            TestForm tf = TestForm.CreateForm();
            tf.MdiParent = this;
            tf.Show();       
       }

子窗体:

    public partial class TestForm : Form
    {
        private static readonly object _obj = new object();
        private static TestForm staticForm = null;
        public TestForm()
        {
            InitializeComponent();
        }
        private void TestForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            staticForm = null;
        }
        public static TestForm CreateForm()
        {
            lock (_obj)
            {
                if (staticForm == null)
                {
                    staticForm = new TestForm();
                }
            }
            return staticForm;
        }
    }

现在的问题是有很多这样的子窗体都继承自BASEFORM那么如何能将各子窗体的createform()方法写到baseform中去变成共通方法?

12 个解决方案

#1


那就把静态变量放到父类中

#2


引用 1 楼 bdmh 的回复:
那就把静态变量放到父类中

反射

#3


你这和单例没关系啊,听起来像工厂的样子

#4


放到父类中去++
然后你这个单例如果有多线程调用的可能应该是加两道锁。
可以网上查一下单例懒汉饿汉。

#5


不止静态变量 还有方法啊。
都放进去后最后Createform出来的是baseform的实例啊。
不能直接给出代码写法么?

#6


关于单例模式窗体的共通------------- 【在线等】
没人帮忙写下么 

#7


要是sp1234 能来就好了。
@sp1234

#8


可以写一个方法来执行CreateForm工作。例如
public static class Extension
{
    private static Dictionary<Type, Form> forms = new Dictionary<Type, Form>();
    private static object _obj = new object();

    public static T CreateForm<T>() where T : Form, new()
    {
        Form f;
        lock (_obj)
        {
            if (!forms.TryGetValue(typeof(T), out f))
            {
                f = new T();
                forms.Add(typeof(T), f);
            }
        }
        return (T)f;
    }
}


不要什么都往继承上去靠,那会变成诡异的程序的。要搞明白继承到底是什么意思!

继承是一个针对“对象实例”的行为,而你这个问题中根本不是对象实例,相反是“不要对象实例”。所以不能用继承。

#9


引用 8 楼 sp1234 的回复:
可以写一个方法来执行CreateForm工作。例如
public static class Extension
{
    private static Dictionary<Type, Form> forms = new Dictionary<Type, Form>();
    private static object _obj = new object();

    public static T CreateForm<T>() where T : Form, new()
    {
        Form f;
        lock (_obj)
        {
            if (!forms.TryGetValue(typeof(T), out f))
            {
                f = new T();
                forms.Add(typeof(T), f);
            }
        }
        return (T)f;
    }
}


不要什么都往继承上去靠,那会变成诡异的程序的。要搞明白继承到底是什么意思!

继承是一个针对“对象实例”的行为,而你这个问题中根本不是对象实例,相反是“不要对象实例”。所以不能用继承。


哇,出现了。
你写的我的消化消化
还有就是你的意思是我那样写不好这个我知道了。
可是我想问能不能写出来呢?
是说我那种想法根本就是代码无法实现的是么?

#10


sp居然和我的实现方法一样,荣幸

我在补充下用法
        
       //假如你有一个窗体是:Form1
       //打开form1的方法
        void ShowForm1()
        {
              Form1 frm = CreateForm<Form1>();
              frm.Show();              
        }

#11


代码能不能写出来是一回事儿,先把“这是还是不是继承的职责”弄清楚更应该是前提。因为那种理解干扰了你的设计思路。

#12


嘿嘿 好的。一会结贴

#1


那就把静态变量放到父类中

#2


引用 1 楼 bdmh 的回复:
那就把静态变量放到父类中

反射

#3


你这和单例没关系啊,听起来像工厂的样子

#4


放到父类中去++
然后你这个单例如果有多线程调用的可能应该是加两道锁。
可以网上查一下单例懒汉饿汉。

#5


不止静态变量 还有方法啊。
都放进去后最后Createform出来的是baseform的实例啊。
不能直接给出代码写法么?

#6


关于单例模式窗体的共通------------- 【在线等】
没人帮忙写下么 

#7


要是sp1234 能来就好了。
@sp1234

#8


可以写一个方法来执行CreateForm工作。例如
public static class Extension
{
    private static Dictionary<Type, Form> forms = new Dictionary<Type, Form>();
    private static object _obj = new object();

    public static T CreateForm<T>() where T : Form, new()
    {
        Form f;
        lock (_obj)
        {
            if (!forms.TryGetValue(typeof(T), out f))
            {
                f = new T();
                forms.Add(typeof(T), f);
            }
        }
        return (T)f;
    }
}


不要什么都往继承上去靠,那会变成诡异的程序的。要搞明白继承到底是什么意思!

继承是一个针对“对象实例”的行为,而你这个问题中根本不是对象实例,相反是“不要对象实例”。所以不能用继承。

#9


引用 8 楼 sp1234 的回复:
可以写一个方法来执行CreateForm工作。例如
public static class Extension
{
    private static Dictionary<Type, Form> forms = new Dictionary<Type, Form>();
    private static object _obj = new object();

    public static T CreateForm<T>() where T : Form, new()
    {
        Form f;
        lock (_obj)
        {
            if (!forms.TryGetValue(typeof(T), out f))
            {
                f = new T();
                forms.Add(typeof(T), f);
            }
        }
        return (T)f;
    }
}


不要什么都往继承上去靠,那会变成诡异的程序的。要搞明白继承到底是什么意思!

继承是一个针对“对象实例”的行为,而你这个问题中根本不是对象实例,相反是“不要对象实例”。所以不能用继承。


哇,出现了。
你写的我的消化消化
还有就是你的意思是我那样写不好这个我知道了。
可是我想问能不能写出来呢?
是说我那种想法根本就是代码无法实现的是么?

#10


sp居然和我的实现方法一样,荣幸

我在补充下用法
        
       //假如你有一个窗体是:Form1
       //打开form1的方法
        void ShowForm1()
        {
              Form1 frm = CreateForm<Form1>();
              frm.Show();              
        }

#11


代码能不能写出来是一回事儿,先把“这是还是不是继承的职责”弄清楚更应该是前提。因为那种理解干扰了你的设计思路。

#12


嘿嘿 好的。一会结贴