我有一个抽象类,用于派生许多其他类,每个类都做类似但略有不同的事情。这些类由反射加载并暴露给用户,以选择他需要运行的一个。
之所以可行,是因为基类有一个名为 Run 的抽象方法,每个派生类都会覆盖该方法。因此,在代码中任何需要这些类型的变量的地方,我都将它们声明为基类。然后当我调用 Run 方法时,它会从真实类型执行该方法(即使我将其声明为基类)。
我的问题是我需要为每个派生类显示自定义的 UI。我想为每个人制作一个自定义 UserControl。这些控件将有一个 puclic 方法,该方法根据用户对其执行的操作返回一个值。然后我在运行时创建这个控件,用户设置需要的内容,我从这个控件调用 return 方法,最后我可以将 i 传递给用户选择的类中的 Run Run 方法并执行它。
我不知道我有多少或哪些派生类,因为用户可以创建从该基类派生的 dll 并将其作为插件附加。
因此,我认为我必须在表单上创建这些自定义控件作为通用 UserControl 类,然后将它们转换为真实类型。但是有什么方法可以只知道控件是从 UserControl 派生出来的吗?
我可以在基类上创建一个公共(public)属性来存储它的自定义控件,但是回到主代码,我可以将通用用户控件转换为存储在该属性中的类型吗?
此外,这里会不会是设计问题?我可以使用其他方法来做到这一点吗?
我希望这听起来不会很困惑:(
最佳答案
我可能误解了你,但这就是我的想法:
public abstract class BaseClass<T> where T: UserControl, IMyControl
{
private Page _page;
protected T Control { get; private set;}
public BaseClass(Page page, string controlPath)
{
_page = page;
Control = (T)page.LoadControl(controlPath);
_page.Controls.Add(Control);
}
public void Run()
{
var data = Control.GetData();
}
}
public interface IMyControl
{
object GetData();
}
关于c# - 从其基类调用继承的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10339676/