父窗体
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
反射
#3
你这和单例没关系啊,听起来像工厂的样子
#4
放到父类中去++
然后你这个单例如果有多线程调用的可能应该是加两道锁。
可以网上查一下单例懒汉饿汉。
然后你这个单例如果有多线程调用的可能应该是加两道锁。
可以网上查一下单例懒汉饿汉。
#5
不止静态变量 还有方法啊。
都放进去后最后Createform出来的是baseform的实例啊。
不能直接给出代码写法么?
都放进去后最后Createform出来的是baseform的实例啊。
不能直接给出代码写法么?
#6
没人帮忙写下么
#7
要是sp1234 能来就好了。
@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
哇,出现了。
你写的我的消化消化
还有就是你的意思是我那样写不好这个我知道了。
可是我想问能不能写出来呢?
是说我那种想法根本就是代码无法实现的是么?
#10
sp居然和我的实现方法一样,荣幸
我在补充下用法
我在补充下用法
//假如你有一个窗体是:Form1
//打开form1的方法
void ShowForm1()
{
Form1 frm = CreateForm<Form1>();
frm.Show();
}
#11
代码能不能写出来是一回事儿,先把“这是还是不是继承的职责”弄清楚更应该是前提。因为那种理解干扰了你的设计思路。
#12
嘿嘿 好的。一会结贴
#1
那就把静态变量放到父类中
#2
反射
#3
你这和单例没关系啊,听起来像工厂的样子
#4
放到父类中去++
然后你这个单例如果有多线程调用的可能应该是加两道锁。
可以网上查一下单例懒汉饿汉。
然后你这个单例如果有多线程调用的可能应该是加两道锁。
可以网上查一下单例懒汉饿汉。
#5
不止静态变量 还有方法啊。
都放进去后最后Createform出来的是baseform的实例啊。
不能直接给出代码写法么?
都放进去后最后Createform出来的是baseform的实例啊。
不能直接给出代码写法么?
#6
没人帮忙写下么
#7
要是sp1234 能来就好了。
@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
哇,出现了。
你写的我的消化消化
还有就是你的意思是我那样写不好这个我知道了。
可是我想问能不能写出来呢?
是说我那种想法根本就是代码无法实现的是么?
#10
sp居然和我的实现方法一样,荣幸
我在补充下用法
我在补充下用法
//假如你有一个窗体是:Form1
//打开form1的方法
void ShowForm1()
{
Form1 frm = CreateForm<Form1>();
frm.Show();
}
#11
代码能不能写出来是一回事儿,先把“这是还是不是继承的职责”弄清楚更应该是前提。因为那种理解干扰了你的设计思路。
#12
嘿嘿 好的。一会结贴