public class MyTokenStore: ITokenStore
{
public IToken CreateRequestToken(IOAuthContext context)
{
...some code here...
}
public IToken CreateAccessToken(IOAuthContext context)
{
...some code here...
}
}
以下哪一个更好?
选项1 - ITokenStore x = new MyTokenStore()
;或
Option2 - MyTokenStore x = new MyTokenStore()
两者的优点是什么?
我可以限制用户使用选项2吗?
答案 0 :(得分:2)
用户自行决定使用哪个版本。选项1的优点是用户可以真正实例化实现该接口的任何类。假设您有一个包含方法的辅助类
DoSomethingVeryUseful(ITokenStore store)
然后再次该方法变得更有用,因为可以使用任何实现所述接口的对象来调用它。
使用选项2的优点是您的类可能包含不属于接口的方法,因此这些方法只能与选项2一起使用。
答案 1 :(得分:1)
对此没有一般的好的回应,因为它完全取决于你的具体情况。
ITokenStore x = new MyTokenStore()
对具体MyTokenStore
实例做了一个“切片”,其中并非所有成员都在ITokenStore
内,因此您无法访问MyTokenStore
中可能存在且不存在的其他信息在ITokenStore
。
另一方面,您创建了一个抽象层,因此可以获得灵活性。
答案 2 :(得分:1)
接口的目的是公开所有实现者共有的功能,并且不了解具体实现。如果您尝试将多个具体对象传递给需要访问接口方法的使用者,请将其转换为接口。
但是,如果您需要具体实现的特定成员,请使用它。
答案 3 :(得分:1)
这不是更好的问题,但更多的是你要用它做什么?要考虑的事情
你打算在Dependency Injection做什么吗?
如果您对至少一个问题的回答是肯定的,那么使用界面是一个好主意,但如果您使用界面只是为了使用界面,您可能需要重新考虑解决方案
答案 4 :(得分:1)
我的建议是以下选项。而是创建“新”对象,我们可以使用构造函数注入。
public class MyTokenStore{
private readonly ITokenStore;
public MyTokenStore{ITokenStore TokenService)
{
this.TokenStore=TokenService;
}
}