草庐IT

c# - 了解接口(interface)

coder 2024-05-19 原文

我仍然无法理解哪些接口(interface)适用。我读了一些教程,但除了“它们使您的类信守 promise ”和“它们有助于多重继承”之外,我仍然不知道它们的真正用途。

就是这样。我仍然不知道什么时候会在实际工作示例中使用接口(interface),甚至不知道什么时候使用它。

根据我对接口(interface)的有限了解,它们可以提供帮助,因为如果某个东西实现了它,那么您可以只传递接口(interface),允许像不同的类一样传递,而不必担心它不是正确的参数。

但我永远不知道这到底是什么意思,因为他们通常会在此时停止展示代码在通过接口(interface)后会做什么,如果他们这样做了,似乎他们没有做任何有用的事情我可以看看然后说“哇,他们会在现实世界的例子中提供帮助”。

所以我想我想说的是,我正在尝试找到一个真实世界的示例,在其中我可以看到正在运行的接口(interface)。

我也不明白你可以像这样引用一个对象:

ICalculator myInterface = new JustSomeClass();

所以现在如果我转到 myInterface 点并且智能感知会拉起我只会看到接口(interface)方法而不是 JustSomeClass 中的其他方法。所以我还没有看到这一点。

我也开始做单元测试,他们似乎喜欢使用接口(interface),但我仍然不明白为什么。

比如这个例子:

public AuthenticationController(IFormsAuthentication formsAuth)
{
    FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
}

public class FormsAuthenticationWrapper : IFormsAuthentication
{
    public void SetAuthCookie(string userName, bool createPersistentCookie)
    {
        FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    }
    public void SignOut()
    {
        FormsAuthentication.SignOut();
    }
}

public IFormsAuthentication FormsAuth
{
    get;
    set;
}

比如为什么要费心制作这个界面?为什么不直接使用其中的方法创建 FormsAuthenticationWrapper 并收工呢?为什么先做一个接口(interface),然后让 Wrapper 实现接口(interface),最后写方法?

然后我不明白声明的真正含义。

就像我现在知道声明是这样说的

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

如果 formsAuth 为空,则创建一个新的 FormsAuthenticationWrapper,然后将其分配给作为接口(interface)的属性。

我想这可以追溯到为什么要引用这个东西的全部原因。特别是在这种情况下,因为所有方法都完全相同。包装器没有接口(interface)没有的任何新方法,我不确定但是当你这样做时,方法被正确填充(即它们有一个主体)它们不会转换为 stub ,因为那看起来真的毫无意义对我来说(它会被转换回一个接口(interface))。

然后在测试文件中他们有:

var formsAuthenticationMock = new Mock<AuthenticationController.IFormsAuthentication>();

所以他们只是传入了 FormsAuthentication,我猜这就是所有伪造的 stub 。我猜包装类是在程序实际运行时使用的,因为它有真正的方法可以做一些事情(比如让一个人退出)。

但是看看 new Mock(from moq) 它接受一个类或一个接口(interface)。为什么不再次让包装类将这些方法放入,然后在新的 Mock 调用中呢?

那不只是为你制作 stub 吗?

最佳答案

好吧,一开始我也很难理解,所以别担心。

想想看,如果你有一个类,可以说是一个视频游戏角色。

public class Character
{
}

现在假设我想让角色拥有武器。我可以使用接口(interface)来确定武器所需的方法:

interface IWeapon
{
    public Use();
}

所以让我们给角色一个武器:

public class Character
{
    IWeapon weapon;

    public void GiveWeapon(IWeapon weapon)
    {
        this.weapon = weapon;
    }

    public void UseWeapon()
    {
        weapon.Use();
    }
}

现在我们可以创建使用 IWeapon 接口(interface)的武器,我们可以将它们提供给任何角色类,并且该类可以使用该元素。

public class Gun : IWeapon
{
    public void Use()
    {
        Console.Writeline("Weapon Fired");
    }
}

然后你可以把它粘在一起:

Character bob = new character();
Gun pistol = new Gun();
bob.GiveWeapon(pistol);
bob.UseWeapon();

现在这是一个通用示例,但它提供了很多功能。如果您查找策略模式,您可以阅读更多相关内容。

关于c# - 了解接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1042114/

有关c# - 了解接口(interface)的更多相关文章

  1. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  2. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  5. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

  6. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

  7. ruby-on-rails - 了解 "attribute_will_change!"方法 - 2

    我想覆盖store_accessor的getter。可以查到here.代码在这里:#Fileactiverecord/lib/active_record/store.rb,line74defstore_accessor(store_attribute,*keys)keys=keys.flatten_store_accessors_module.module_evaldokeys.eachdo|key|define_method("#{key}=")do|value|write_store_attribute(store_attribute,key,value)enddefine_met

  8. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  9. c# - C# 中的 Flatten Ruby 方法 - 2

    我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume

  10. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

    我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

随机推荐