【发布时间】:2017-11-29 01:20:34
【问题描述】:
我正在研究 SOLID 原则,而接口隔离原则让我在这样的场景中难以理解。
基本上,我有一组对象...用户...使用界面。
public interface IUserInfo
{
string Name { get; }
string Extension { get; }
}
问题是在某些情况下,继承此接口的类不会使用扩展。所以为了解决这个问题,它只返回一个空字符串。
现在,从技术上讲这很好,因为字符串已绑定到 UI。所以它只会为该字段显示一个空字符串。
但是,这违反了接口隔离原则。建议拆分这些接口。
但后来我遇到了我希望在集合中使用这个接口的问题,考虑一下:
public interface IUserExtension : IUserInfo
{
string Extension { get; }
}
public ObservableCollection<IUserInfo> StoredUserInfos { get; set; } = new ObservableCollection<IUserInfo>()
{
new User1(),
new User2(),
};
public class User1 : IUserExtension
{
public string Name { get; } = "Alex";
public string Extension { get; } = "(715) 925";
public override string ToString()
{
return Name;
}
}
public class User2 : IUserInfo
{
public string Name { get; } = "Daniel";
public override string ToString()
{
return Name;
}
}
我无法绑定到这个集合的索引并获取Extension,因为它是一个IUserInfo接口。巧合的是,我也无法将其设为 IUserExtension 的集合,因为 User2 类没有实现它。
据我所知,唯一可行的方法是使用模式匹配
if (UserIndex != -1)
{
var userInfo = StoredUserInfos[UserIndex];
Extension = userInfo is IUserExtension info ? info.Extension : "No Extensions";
Name = userInfo.Name;
}
但这会给代码增加一点复杂性,并且可能会违反其他规则,因为它正在检查类型。
在这种情况下,最好的解决方案是实现一个实现接口的抽象类,而默认实现是一个空字符串?
【问题讨论】:
标签: c# interface solid-principles