c#中普通类和接口有什么区别?

时间:2018-02-10 09:12:06

标签: c# class object interface instance

接口:

public interface IAuthenticationRepository
    {
        Task<IEnumerable<dynamic>> GetMenuItems(string groupIds);
    }

类:

 public class AuthenticationRepository : Base, IAuthenticationRepository
    {
        public AuthenticationRepository(string sqlConnRep) : base(sqlConnRep) { }

        public async Task<IEnumerable<dynamic>> GetMenuItems(string groupIds)
        {
            var menuAndFunctions = $@"select gfm.GroupId, fmm.MenuId, cm.MenuType, cm.MenuName, fmm.FunctionId,cf.FunctionName, 
                                    cf.Description, cf.IsDefault from FunctionMenuMapping fmm 
                                    inner join CoCMenu cm 
                                    on cm.Id = fmm.MenuId 
                                    inner join CoCFunction cf 
                                    on cf.Id = fmm.FunctionId 
                                    inner join GroupFunctionMapping gfm 
                                    on gfm.FunctionId = fmm.FunctionId 
                                    where gfm.GroupId in (" + groupIds + ")";
            return await ExecQueryDynamic<dynamic>(menuAndFunctions);
        }

AuthenticationRepository类创建实例并将实例分配给AuthenticationRepository类对象

public class AuthenticationLogic : IAuthenticationLogic
    {
            readonly AuthenticationRepository authenticationRepository;
            public AuthenticationLogic( AuthenticationRepository authenticationRepository)
            {
                this.authenticationRepository = new AuthenticationRepository("");
            }
    }

AuthenticationRepository类创建实例,并将实例分配给 IAuthenticationRepository 界面

public class AuthenticationLogic : IAuthenticationLogic
    {
                readonly IAuthenticationRepository IauthenticationRepository;
                public AuthenticationLogic(IAuthenticationRepository IauthenticationRepository)
                {
                    this.IauthenticationRepository = new AuthenticationRepository("");
                }
    }
  

他们之间有什么区别?两者都在做同样的事情。它有任何持久性差异吗?哪一个最好的方法?

2 个答案:

答案 0 :(得分:1)

接口是一个契约,它允许您使用抽象而不是具体的实现,这意味着您的代码更加分离,并且更加可重用和可测试。第二个版本更好,因为传递接口意味着您的代码仅依赖于传入的对象符合“合同”的事实。由该界面提供。只要满足要求,构造函数就不应该关心实际对象是什么。这允许您在将来更改实施细节和类型,但只要您仍然实现该界面,您就不必更改该代码

答案 1 :(得分:1)

接口用于在您使用类的位置隐藏实现。使用它的类只知道接口而不知道它的实现。 这通常与依赖注入结合使用,其中所有属性都通过构造函数作为接口传入,并且您在应用程序的某个点注册哪个实现应该用于哪个接口。 这样可以轻松进行测试,就像在单元测试中一样,您可以创建类的测试实现,以便将测试传递给类,这样您就只测试类本身而不测试它的依赖性。这被称为模拟,并且有一些框架可以自动为您创建模拟。