C# 动态设置新实例的类型

C# 动态设置新实例的类型,c#,interface,C#,Interface,我有一个问题,我正在以完全相同的方式为不同的孩子类型创建一个新的孩子。我无法重用调用它的方法,因为我不知道如何动态设置新实例的类型 if (radioSomeType.Checked) { SomeType child = new SomeType(); child.MdiParent = parent; child.Open(); } else if(radioSomeOTherType.Checked) { SomeOtherType child = new

我有一个问题,我正在以完全相同的方式为不同的孩子类型创建一个新的孩子。我无法重用调用它的方法,因为我不知道如何动态设置新实例的类型

if (radioSomeType.Checked)
{
    SomeType child = new SomeType();
    child.MdiParent = parent;
    child.Open();
}
else if(radioSomeOTherType.Checked)
{
    SomeOtherType child = new SomeOTherType();
    child.MdiParent = parent;
    child.Open();
}
我在本文中设置了一些其他属性并调用了一些其他方法,但在本例中我已经删除了它们

我知道如何使用接口,但我不确定最初如何为实例设置类型

if (radioSomeType.Checked)
{
    SomeType child = new SomeType();
    child.MdiParent = parent;
    child.Open();
}
else if(radioSomeOTherType.Checked)
{
    SomeOtherType child = new SomeOTherType();
    child.MdiParent = parent;
    child.Open();
}
我希望减少重复,并执行以下操作:

if (radioSomeType.Checked)
{
    SomeType child = new SomeType();
}
else if(radioSomeOTherType.Checked)
{
    SomeOtherType child = new SomeOTherType();
}
child.MdiParent = parent;
child.Open();

我的问题是,即使我尝试使用接口,我仍然需要在该条件内以某种方式创建实例(这是我所期望的)。

您想要做的事情与下面的代码类似,其中
ISomeType
是一个
SomeType
SomeOtherType
都实现的接口

原始代码的问题在于,您在每个
if
语句中声明了子变量,因此该块之外的任何代码都无法使用该子变量

ISomeType child;
if (radioSomeType.Checked)
{
    child = new SomeType();
}
else if(radioSomeOTherType.Checked)
{
    child = new SomeOTherType();
}
child.MdiParent = parent;
child.Open();

您要做的是类似于下面的代码,其中
ISomeType
是一个接口,它由
SomeType
SomeOtherType
实现

原始代码的问题在于,您在每个
if
语句中声明了子变量,因此该块之外的任何代码都无法使用该子变量

ISomeType child;
if (radioSomeType.Checked)
{
    child = new SomeType();
}
else if(radioSomeOTherType.Checked)
{
    child = new SomeOTherType();
}
child.MdiParent = parent;
child.Open();

你不应该在条件中创建对象,检查工厂模式:@ChrisHardie我明白你的意思,但是工厂模式在这个例子中没有用处。我正在创建MDI子项-没有至少选择一个单选按钮的场景。我想您误解了。您可以将选中的单选按钮的值传递给工厂,工厂将确定返回哪个对象。它免除了调用代码确定要创建哪个对象的责任。如果你有许多单选按钮,工厂会很好地清理一切。@ChrisHardie工厂模式在大多数情况下都能做到这一点,即在条件分支中创建不同的对象——即使你引用的代码也能做到这一点。虽然我相信工厂模式有它的应用程序,但我不认为像本例中那样隐藏简单的条件流是有效的。@ChrisHardie:我的观点是,创建新实例的工厂代码执行完全相同的逻辑。我认为为这一次事件实现工厂模式太过分了(我不会在其他任何地方使用它)。你不应该在条件中创建对象,请查看工厂模式:@ChrisHardie我明白你的意思,但是工厂模式在这种情况下没有用。我正在创建MDI子项-没有至少选择一个单选按钮的场景。我想您误解了。您可以将选中的单选按钮的值传递给工厂,工厂将确定返回哪个对象。它免除了调用代码确定要创建哪个对象的责任。如果你有许多单选按钮,工厂会很好地清理一切。@ChrisHardie工厂模式在大多数情况下都能做到这一点,即在条件分支中创建不同的对象——即使你引用的代码也能做到这一点。虽然我相信工厂模式有它的应用程序,但我不认为像本例中那样隐藏简单的条件流是有效的。@ChrisHardie:我的观点是,创建新实例的工厂代码执行完全相同的逻辑。我认为在这次事件中实现工厂模式太过分了(我不会在其他任何地方使用它)。我同意,这听起来是对的。我以为我已经试过了,但我可能错了。我会测试并接受它,如果这是好的。工程完美。我将
表单
方法移到了我的界面中(这两个表单都已经实现了)。我同意,这听起来是对的。我以为我已经试过了,但我可能错了。我会测试并接受它,如果这是好的。工程完美。我将
表单
方法移动到我的界面中(这两个表单都已经实现了)。