C# 如何避免在基类中实现所有接口同时也不让每个子类重复实现
"动态组合+默认接口方法"方案可以通过C# 8.0引入的默认接口方法和组合模式来实现。这种方案可以很好地解决接口爆炸问题,同时保持代码的灵活性和可扩展性。以下是完整的实现方案:
方案核心思想
- 接口隔离原则:每个特性定义独立接口
- 默认实现:接口方法提供默认实现
- 动态组合:运行时按需组合特性组件
- 统一访问:通过基类提供特性访问入口
完整代码示例
csharp
// 定义特性接口
public interface IBorderFeature
{
float BorderWidth { get; set; }
Color BorderColor { get; set; }
void DrawBorder(Graphics g) =>
Console.WriteLine($"绘制默认边框:宽度{BorderWidth}, 颜色{BorderColor}");
}
public interface IShadowFeature
{
Vector2 ShadowOffset { get; set; }
Color ShadowColor { get; set; }
void DrawShadow(Graphics g) =>
Console.WriteLine($"绘制默认阴影:偏移({ShadowOffset.X},{ShadowOffset.Y})");
}
public interface IBadgeFeature
{
string BadgeText { get; set; }
Color BadgeColor { get; set; }
void DrawBadge(Graphics g) =>
Console.WriteLine($"绘制默认角标:{BadgeText}");
}
// 基类实现
public abstract class ControlBase
{
private readonly Dictionary<Type, object> _features = new();
// 动态添加特性组件
public void AddFeature<T>(T feature) where T : class =>
_features[typeof(T)] = feature;
// 获取特性组件
public T GetFeature<T>() where T : class =>
_features.TryGetValue(typeof(T), out var feature) ? feature as T : null;
// 渲染入口
public virtual void Render(Graphics g)
{
GetFeature<IBorderFeature>()?.DrawBorder(g);
GetFeature<IShadowFeature>()?.DrawShadow(g);
GetFeature<IBadgeFeature>()?.DrawBadge(g);
}
}
// 具体控件实现
public class ButtonControl : ControlBase
{