【问题标题】:Implementing an Interface but changing a member to be private实现接口但将成员更改为私有
【发布时间】:2011-03-13 03:38:03
【问题描述】:

默认情况下,接口的所有成员都是公共的。但是我的接口中有一些属性我想用作实现我的接口的某些子类的私有成员。这是可以并且已经完成的事情还是我在这里的基础。这些天我正在努力在我的架构中使用更多接口,所以我还不是很精通。

【问题讨论】:

标签: c# interface


【解决方案1】:

接口的意义在于它们提供了一个契约,其他对象可以使用该契约与您的对象进行通信。如果您将接口中声明为public 的成员更改为private,那么您没有履行合同- 另一个对象可能需要读取该属性/调用该方法,您必须允许他们这样做。

接口永远不会有private 成员,因为接口用于两个对象之间的“接口”。你的内部private 成员对它没有影响,只要你坚持你的合同结束。

【讨论】:

  • “接口的关键在于它们提供了一个契约,其他对象可以使用它来与你的对象进行通信。” “你的对象”具体是什么意思
  • 实现接口的对象(我假设这是你写的那个)。
  • 值得一提的是,微软自己也违反了这条规则。如果您查看作为核心通用字典一部分的 KeyCollection 或 ValueCollection 类,您会发现它们实现了 ICollection 并且许多接口方法被标记为私有。随心所欲。
【解决方案2】:

继续你的问题,以及你对“子类”这个词的使用,我认为你还没有完全理解接口。

我知道您可能已经听过这句话一​​百万次了,但是,接口描述了对象的作用,而类描述了它的作用方式。一个类 IMPLEMENTS,一个接口,它不继承自它。

因此,如果您愿意,可以为您的基类或子类提供一个接口,但您的问题让我认为您正在考虑的是基类(抽象类),而不是接口。

这有意义吗?

【讨论】:

  • 是的,我明白这一点。因此,为您的抽象类创建一个接口是一种选择。
  • 我想要一个合同,我们确实有其他实现具有相同的模式,所以我创建的接口是常见的功能,每个我们使用这些接口构建的应用程序类型的实现不同,这在至少要使用接口而不是抽象类,因为我正在为 Web 服务包装器创建一堆接口,以便在各种 3rd 方 API 中使用
【解决方案3】:

由于接口没有访问修饰符,如果您仍然希望您的方法在实现该接口的类中是私有的,您可以显式地实现该接口。

这样你的类方法将是私有的。

【讨论】:

    【解决方案4】:

    您必须完全了解接口是什么。事实上,这只是外界对班级成员的期望的描述。它不创建成员,它只是通知指定的类有指定的方法在公共范围内使用。因此,正如您在界面中看到的那样,您只能描述公共成员。

    另一方面,如果您想声明一些固定或虚拟的私有成员,您可以使用带有抽象基类的经典继承。在这种情况下,您会将要在子类中实现的所有方法设为抽象,并实现您要在基类中定义的方法。

    希望这会有所帮助.. 问候

    【讨论】:

    • 是的,我明白它们是什么......我的问题还有很多,但解释的太多了。
    • 感谢关于使用基类实现接口成员的良好描述。这很有帮助。
    • 嗯,不只是外面的世界。您可以使用接口来创建所需的结构并在应用程序层中保持一致的结构。此外,由于您应该始终通过接口进行单元测试,那么您应该为每个类都有一个接口......所以这里不仅仅是代码重用或通过抽象向外界公开功能......还有很多其他原因如果您不向外界公开接口层,您将使用接口,我不正确吗?
    • 我所说的外部世界是指课堂之外,而不是组装;)
    【解决方案5】:

    接口仅适用于公共访问。在内部,对象通过接口引用自己是很奇怪的。

    如果您想要强制实现的私有变量,您想要使用抽象类,并将它们标记为受保护。

    【讨论】:

      【解决方案6】:

      想一想 - 你就会明白这是不可能的:

      接口就像一个联系人。接口的所有公共字段都是联系人的一部分。

      因此,您不能将它们隐藏在子类中...
      如果有人将您的类对象向上转换为接口的类型会怎样?

      您可能想要更改您的设计 - 可能会将您的界面分成两个界面? 或者和接口和一个抽象类?我们需要了解更多细节...

      【讨论】:

        猜你喜欢
        • 2017-01-12
        • 1970-01-01
        • 2015-07-03
        • 2013-01-03
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        相关资源
        最近更新 更多