给定以下类:
public interface ISession {}
public class Session : ISession
{
internal Uri ServerUri { get; private set; } // not in interface obviously
}
现在我在同一个项目中有另一个依赖于 Session
的类:
public interface IDataClass {}
internal DataClass : IDataClass
{
private readonly Session _session;
public DataClass(ISession session)
{
_session = (Session) session;
}
// some more methods that access the internal property _session.ServerUri
// and call methods on the session object
// ...
}
所以实际上 Session 类非常复杂。为了对 DataClass
进行单元测试,我将构造函数参数设置为 ISession
,因此我能够模拟依赖关系并验证对 ISession
的某些方法调用模拟。
但是,DataClass
中的某些方法必须访问 _session.ServerUri
属性,因此该字段必须是 Session
类型比 ISession
。
我还可以创建 ISession
类型的字段,并在每次访问内部属性时强制转换该字段,这将使在这个特定位置更清楚为什么具体的 internal
甚至需要上课。
每次我以上述方式实现转换时,我都想知道是否可以通过更好的代码设计来避免转换。通常我会找到更好的方法并摆脱强制转换。
但是上面的例子呢?这是好的代码设计吗?或者有更清洁的方法吗?我只是觉得以上述方式从构造函数初始化字段很奇怪。
最佳答案
老实说,我认为您当前的系统不是一个好主意。
您的构造函数声明“只要它实现了 ISession
,我就接受任何东西”,但这不是真的 - 调用代码可能很难发现这一点当他们在尝试创建 DataClass
实例时收到 InvalidCastException
。
所以你真的应该在 ISession
或继承自 ISession
的接口(interface)中声明 ServerUri
- 但是在任何一种情况下,您都需要通过接口(interface)仅在 DataClass
关于c# - 将构造函数参数从接口(interface)类型转换为具体类类型在这里是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23789659/