哪一个更好地创建类的对象或通过接口调用它

时间:2013-11-19 13:25:30

标签: c# .net

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吗?

5 个答案:

答案 0 :(得分:2)

用户自行决定使用哪个版本。选项1的优点是用户可以真正实例化实现该接口的任何类。假设您有一个包含方法的辅助类

DoSomethingVeryUseful(ITokenStore store)

然后再次该方法变得更有用,因为可以使用任何实现所述接口的对象来调用它。

使用选项2的优点是您的类可能包含不属于接口的方法,因此这些方法只能与选项2一起使用。

答案 1 :(得分:1)

对此没有一般的好的回应,因为它完全取决于你的具体情况。

ITokenStore x = new MyTokenStore()

对具体MyTokenStore实例做了一个“切片”,其中并非所有成员都在ITokenStore内,因此您无法访问MyTokenStore中可能存在且不存在的其他信息在ITokenStore

另一方面,您创建了一个抽象层,因此可以获得灵活性。

答案 2 :(得分:1)

接口的目的是公开所有实现者共有的功能,并且不了解具体实现。如果您尝试将多个具体对象传递给需要访问接口方法的使用者,请将其转换为接口。

但是,如果您需要具体实现的特定成员,请使用它。

答案 3 :(得分:1)

这不是更好的问题,但更多的是你要用它做什么?要考虑的事情

  1. 您是否要让多个对象实现该界面?
  2. 你打算做unit testing吗?
  3. 你打算在Dependency Injection做什么吗?

    如果您对至少一个问题的回答是肯定的,那么使用界面是一个好主意,但如果您使用界面只是为了使用界面,您可能需要重新考虑解决方案

答案 4 :(得分:1)

我的建议是以下选项。而是创建“新”对象,我们可以使用构造函数注入。

public class MyTokenStore{

private readonly ITokenStore;

public MyTokenStore{ITokenStore TokenService)
{
this.TokenStore=TokenService;
}

}