处理同一形式的多个对象类型的好方法是什么
本文关键字:对象 类型 是什么 方法 处理 | 更新日期: 2023-09-27 18:20:57
我有一个抽象基类和两个派生类。基类包含6个属性,所有属性都可以在表单上维护。
这两个派生类都有一个额外的属性。这两个属性也可以保持在同一个表单上
在我的表格中,我现在有这样的代码:
btnSomething.visible = (myObject is DerivedA);
pnlPanel.visible = !(myObject is DerivedA);
if(myObject is DerivedA)
myBindingSource.DataSource = myObject as DerivedA
mySecondBindingSource = myObject;
我对这种方法不太满意,它闻起来很臭。所以我的问题是,什么是使其更加面向对象的好方法?因为未来DerivedC可能会进入…
我认为这种方法打破了OCP原则(可能还有其他原则)
您可以在这里使用多态性和继承:
定义接口
interface ICommonFeatures
{
bool ContainsFoo {get;}
//yak-yak
}
然后你的派生类实现它
class DerivedA: ICommonFeatures
{
bool ContainsFoo {get {return true;}}
//so-and-so
}
class DerivedB: ICommonFeatures
{
bool ContainsFoo {get {return false;}}
//this-and-that
}
当你使用它时,你只处理接口
ICommonFeatures foo = new DerivedB();
btnSomething.visible = foo.ContainsFoo;
pnlPanel.visible = foo.Prop2;
myBindingSource.DataSource = foo.CurrentDataSource
一个疯狂的想法是让UI具有可扩展性。你可以让一个表单实现一个基本表单。
然后,在派生的窗体类中,只插入其模型类缺少的控件和行为。在派生模型类或库中,您可以将某种排序绑定到正确的形式
一个很好的方法是遵循一些MVP原则。
希望它能对你有所帮助。。
我会为每个需要根据底层类型进行操作的控件声明一个抽象布尔方法/属性。
例如
// to handle pnlPanel.visible = !(myObject is DerivedA);
abstract bool SupportsPanel{get;}
至于您的绑定源,我还将提供一些虚拟的BindingSource
和SecondBindingSource
属性。
也许类似(纯粹是一个例子)
public abstract class BaseClass
{
// All your exising class declaration here
public virtual object BindingSource
{
get
{
// By default, a BaseClass is not valid as a binding source
return null;
}
}
public virtual object SecondBindingSource
{
get
{
// By default, a BaseClass is a valid Second Binding source
return this;
}
}
}
public class DerivedA : BaseClass
{
// All your exising class implementation here
public override object BindingSource
{
get
{
// For DerivedA, the data sourse is itself.
// other classes might have their own implementations.
return this;
}
}
// No need to override SecondBindingSource as the BaseClass one works as expected.
}
因此,您的代码可能不再关心对象类型,而看起来像:
myBindingSource.DataSource = myObject.BindingSource;
mySecondBindingSource = myObject.SecondBindingSource;
希望这能有所帮助。