【问题标题】:Issue related to concept of abstraction in OOPs与 OOP 中的抽象概念相关的问题
【发布时间】:2013-11-12 09:44:52
【问题描述】:

我正在使用文章从互联网上阅读 OOP 概念。

在一篇文章中,我阅读了以下关于抽象的内容:

如果我们在“Billing”类中有一个名为“CalculatePrice”的方法, 我们不关心里面的计算 “计算价格”方法。我们只需传递必要的参数并获取 输出。我们隐藏了“计算价格”的实现。

所以我的问题是:在 C# 中,我们使用 dll 和命名空间并调用特定的方法。我们可以说,dll 和命名空间是抽象的概念吗??

谢谢

【问题讨论】:

  • 这个问题毫无意义。方法的实现与命名空间有什么关系?命名空间只是一种将类分割成逻辑单元的方法。方法的实现与此无关。
  • 我的意思是当我们使用 dll 时,我们必须在程序的开头写“使用命名空间”,如“使用系统”。
  • 基本上没有。命名空间不是抽象的概念。您显然误解了抽象是什么。
  • 文章是关于类的,C#有类。无需寻找其他等效的元素。
  • 只有在使用命名空间之后我们才能创建一个类的对象,然后我们才能使用类的对象调用特定的方法。所以 dll 和命名空间是相互连接的。

标签: c# asp.net oop abstract


【解决方案1】:

没有。

您通常应该将 dll 文件和命名空间视为组织项目的方式。

CalculatePrice 的抽象只是简单地将其逻辑“隐藏”在方法中。当另一段代码调用该方法时,它并不关心其中发生了什么——它只对结果感兴趣。

C#(和一般的 .Net)中的抽象是使用 接口抽象类以及方法和属性等内容生成的在这些中定义和/或实现的。

您应该关注这些概念,以及它们如何以不同的“模式”一起使用以解决各种类型的问题。

稍微扩展一下您的示例:如果在接口中定义了CalculatePrice,则调用代码将与该接口“对话”,而无需关心其背后的内容。该接口的实现——实际执行逻辑的代码——可以是任何东西。只要它满足接口中定义的要求(“合同”),它就可以改变并继续改变,因为这将允许调用代码继续使用它.. 是如何抽象在 C# 中工作。

【讨论】:

  • 我可以看到这里有一票反对票。知道它的原因会很有趣。
【解决方案2】:

有趣的是,有四个答案都说“不”。实际上,答案是“有时”。如果CalculatePrice 的实现依赖于另一个标记为内部的类,那么它的程序集确实构成了抽象的一部分,因为内部类只能由该程序集中的其他类访问。​​

.NET 中的命名空间并不构成任何抽象的一部分。在其他语言中它们可以,因为 internal 可以绑定到命名空间,但这不是 .NET 语言的工作方式。

这种信息隐藏是最基本的抽象形式。 C# 最强大的抽象工具是接口,支持依赖注入并将方法视为值。如果您有兴趣了解更多关于 C# 中的抽象,它们是需要关注的三个领域。

【讨论】:

  • 有趣的一点,但是:如果一个类是内部的,那么它对调用代码是不可见的。理论上,它可以在呼叫方根本没有注意到的情况下被替换。那么是否仍然是抽象的一部分,只是因为它被隐藏了?不知道我自己会如何定义这个..(无论哪种方式 - 这可能有点超出 OP 的上下文,尽管它可能是一个好点:))。
  • @Kjartan 将内部工作原理隐藏在公共 API 之外是一种抽象。如果它对调用代码是不可见的,那么它就是抽象的。然而,我们的目标远高于简单的抽象隐藏,而是以解耦为目标,例如通过使用接口。这里的其他答案似乎将解耦和抽象视为同一件事。在我看来这是一个错误。
  • 问题是关于概念的。 “我们可以说,dll 和命名空间是抽象的概念吗?”答案是否定的。
  • @James 我认为你对那些母语不是英语的人说的话过于直白了。
【解决方案3】:

所以我的问题是:在 C# 中,我们使用 dll 和命名空间并调用特定的方法。我们可以说,dll 和命名空间是抽象的概念吗??

没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多