【发布时间】:2020-05-22 15:35:29
【问题描述】:
我不停地为此挠头,试图找出最好的前进方式。假设我有一个可选择的模型类,所有可选择的对象都可以更改它们的颜色以显示它们已被选中。 我想将功能放入单独的接口中,因为有些东西可以改变不一定可选择的颜色,但是,可选择的所有内容都需要是 IColourable,所以我可以使 ISelectable 接口继承 IColourable 接口,如下所示:
interface ISelectable : IColourable
{
void SetIsSelected(bool isSelected);
}
interface IColourable
{
void UpdateColour(Color color);
}
class Model : ISelectable
{
private bool _isSelected;
public void UpdateColour(Color color)
{
...
}
public void SetIsSelected(bool isSelected)
{
_isSelected = isSelected;
}
}
所以现在我正在考虑保持模型类较小(因为它实现了许多其他接口)让 ISelectable 和 IColourable 的实现委托给另一个对象 - 例如 ModelSelectableImpl 和 ModelColourableImpl
所以现在类 Model 看起来像:
class Model : ISelectable
{
private ISelectable _selectableImplementation;
private IColourable _colourableImplementation;
public Model()
{
_selectableImplementation = new ModelSelectableImpl(this);
_colourableImplementation = new ModelColourableImpl(this);
}
public void SetIsSelected(bool isSelected)
{
_selectableImplementation.SetIsSelected(isSelected);
}
public void UpdateColour(Color color)
{
_colourableImplementation.UpdateColour(color);
}
}
我还有另外两个类来实现模型接口
class ModelColourableImpl : IColourable
{
private IColourable target;
public ModelColourableImpl(IColourable colourable)
{
target = colourable;
}
public void UpdateColour(Color color)
{
// Update targets colour
}
}
class ModelSelectableImpl : ISelectable
{
private Model target;
private bool _isSelected;
public ModelSelectableImpl(Model model)
{
target = model;
}
public void SetIsSelected(bool isSelected)
{
_isSelected = isSelected;
}
public void UpdateColour(Color color)
{
// GRRRRR I don't want this to have to be here, can probably do something like:
target.UpdateColour(color);
// But it just seems messy having it in this class
}
}
所以你可以看到烦恼在哪里,我有一个 ModelSelectableImpl,它现在有一个 UpdateColour 的实现,它将它传递回模型以传递给 ModelColourableImpl,这看起来有点乱。
【问题讨论】:
标签: c# design-patterns code-cleanup