问题标签 [concreteclass]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
442 浏览

.net - .NET:使用配置文件选择具体类

(这个问题专门在 C# 中,但一般适用于 .NET)

我有一个大型应用程序,它的设计相当不错,并且通过接口分为主要部分(这样做是为了帮助并行开发)。

我们现在有一组主要的具体类来实现所需的接口,但我们也有额外的具体类集用于替代情况和测试。

目前,我们将所有这些类放在代码的顶层:

如果我想换出组件,那么我只需要更改该行并重新编译:

这很好用,但显然需要重新编译——我宁愿使用配置文件中的值选择具体类。

使用配置文件更改具体类的标准模式是什么?有没有我可以使用的标准库来为我解决这个问题?

谢谢!

0 投票
13 回答
36231 浏览

c# - 接口中的内部成员

我有一个实现接口的对象列表,以及该接口的列表:

前面的代码无法编译,因为编译器要求所有接口成员都是公共的。

但我不想让我的 DLL 外部ConcreteIAMMyList.

有什么办法可以做到这一点?

更新#1:大家好,感谢到目前为止的答案,但它们都不是我所需要的:

该接口需要是公共的,因为它是来自 dll 外部的客户端将使用的签名,以及ID我在示例中不费心编写的其他属性以保持简单。

安德鲁,我不认为解决方案是创建一个工厂来创建另一个包含IAM成员+保存的对象。我还在想……还有其他的想法吗?

0 投票
2 回答
2427 浏览

java - 具体类实现了一个接口。稍后类型转换为接口。JVM 如何识别 Typecasted 实例?

类型转换为接口的具体类,JVM 是否仍然认为它是具体类的实例?

0 投票
4 回答
1426 浏览

c# - 返回接口但具体的属性可能不在接口上,我可以通过强制转换获得它们吗?

我感觉我对界面的使用不正确。我知道接口是具体类必须遵守的合同。

因此,我将解释我要解决的问题,也许有人可以为我指明正确的方向。

我正在构建一个为任何请求返回页面的应用程序,我有三种页面类型,Cms、产品和类别。

这三个都必须实现以下接口:

无论页面类型如何,都需要这些属性。

一个页面可能有额外的属性,具体取决于它们的类型,例如一个类别页面可能是这样的:

目前我有一个页面服务,它将为请求的 url 返回一个页面。

根据 PageType 它知道要返回什么类型的页面。

问题是 pageService 返回一个 IPage 以便它可以返回任何页面类型。

这是一个问题,因为并非我的所有具体都只实现了接口,在类别页面的情况下,它也有一个列表,正如您所期望的,除非我转换为具体类型,否则我无法访问。

但是有没有办法我可以返回一个通用的页面类型并让接收者知道它是什么具体的?

我确信我现在是如何做到这一点的并不是最好的方法,并且想要一些关于如何解决这个小问题的指导和建议。

谢谢

更新

我已经安顿好了演员表。

我确信必须有更好的方法来处理几个类使用一些基本属性但也实现它们自己的情况。当您从服务中获得这些类之一时,您需要知道您得到了什么,以便您可以使用相关属性..

或者也许我在这里尝试做的只是完全错误的,我需要采取另一种方法。我想我会继续我现在所拥有的,但要继续思考它。

更新 2

我已经改变了我这样做的方式,所以我不需要演员,我有一个 PageType 枚举,我用它来识别正在使用的页面的类型。

这与继承所有需要的 Ipage 相结合似乎是一个足够好的解决方案,并且不需要演员表。

0 投票
4 回答
2904 浏览

c# - 方法声明的返回类型应该是接口还是具体类?

在一般情况下,接口或抽象类通常是合适的决定,对吗?

但在某些情况下,具体类看起来更好。例如,

Replace方法String返回一个具体的类。(这只是一个例子,虽然 String 没有实现任何接口。)

我的问题是

  1. 什么时候应该返回一个接口,什么时候应该返回一个具体的类?

  2. 它是program to an interface, not an implementation返回接口的一部分吗?

0 投票
2 回答
2845 浏览

ruby - 抽象类与具体类?

我正在学习面向对象编程,但我对抽象类和具体类感到困惑。一些现实世界的例子将不胜感激。使用一个比另一个有什么好处?什么时候更喜欢抽象类和具体类?

如果答案比我在上下文中所要求的任何语言都特定Ruby

0 投票
1 回答
2699 浏览

spring - 最佳实践:Spring Autowired、具体类和 Builder

我们有一个接口:

以及一个实现它的类

我们曾经使用构建器实例化 EmailNotifyService:

... 等等。但是现在,我们不再使用 build() 创建一个新的 EmailNotifyService,而是尝试使用 Autowire 和 Spring。问题是在我们应用程序的其他任何地方,我们都是自动装配接口,而不是类。从我读到的内容来看,总的来说这是一个好主意。事实上,我已经尝试将 NotifyService 重写为 Abstract 类,然后让 EmailNotifyService 扩展它。但是 Spring 没有正确地自动装配它,它没有像为接口创建代理一样,而且我所有的 Autowired 字段都是空的。

所以看起来我们被自动装配 NotifyService 接口所困。美好的。我无法理解的是 - 我怎样才能将我用来分配给构建器的数据 - Person、EmailType 和 Event - 放入 Spring Autowired 接口中?

我想我可以将接口定义更改为具有 setPerson()、setEmailType() 等,但除了非常丑陋之外,它首先违背了使用接口的目的。不同的 NotifyService(例如 WebServiceNotifyService 或 RestNotifyService)晚上不需要该信息。

是否有任何优雅的最佳实践方法来做到这一点?

谢谢。

编辑

我正在使用注释,很少使用 xml。而且我也在使用事务管理,这可以解释为什么抽象类没有正确自动装配?这是我在 xml 中唯一的相关信息:

当我说“自动装配无法正常工作”时,我的意思是当我尝试自动装配抽象类时,Spring 似乎并没有像为接口创建代理一样,而且我的 EmailNotifyService 中的所有 Autowired 字段( PersonRepository, others ...) 为空。当我使用接口时,所有 Autowired 字段都正确连接。

但我的主要问题是我曾经明确地使用具体类,使用构建器直接创建一个新的 EmailNotifyService(),并将信息传递给它——Person、EmailType 和 Event。这些只是普通的豆子。在 EmailNotifyService 中没有针对它们的 setter/getter,但是有 EmailBuilder,它曾经存在于 EmailNotifyService 中。

但现在我使用的是 NotifyService 接口,它对 Person、EmailType 或 Event 一无所知。但我需要这些信息才能使 EmailNotifyService 工作。

所以我的问题是,如果我使用 Spring 像这样自动装配我的 EmailNotifyService:

我如何设置 Person、EmailType 和 Event 数据,因为 NotifyService 对它们一无所知?

目前我们在 web 应用程序中使用邮件服务,但理论上邮件服务应该能够独立工作。无论如何,我看不到请求范围的 bean 如何在这里帮助我。

0 投票
1 回答
23 浏览

concreteclass - 从超类中找出具体实现

我正在尝试重构大型代码库的一部分,并且处于代码类似的位置-

现在整个代码库中有很多以 List< Animal > 为输入的方法,所以我不想打扰这些接口。在许多这些方法中,通常会迭代列表,并且根据列表中每个对象的 Animal 对象的“类型”属性完成一些处理。为此,我必须从 Animal 到 Cat 或 Dog 进行丑陋的沮丧。例子:

我想知道是否还有其他方法可以做到这一点。有什么想法吗?

0 投票
1 回答
1427 浏览

interface - 具体类与接口:何时使用?

我非常了解接口的好处以及它如何帮助聚合相似类型对象的通用功能。但是我相信人们已经把这个“总是程序到一个界面”有点过分了。

a) 人们总是从定义一个接口开始,然后在一个类中实现它,即使该接口太具体而无法由任何其他类实现。- 我是唯一一个认为这没有用的人吗?

b) 强制所有“相关”接口派生为一个通用(无用)接口,因为它现在是“可扩展的”——什么?

c) 在两个或多个对象看似相关但由于其潜在差异而很难定义通用接口方法的情况下,您会怎么做?

例如,一个以方法命名的IConnection接口Connect()。(这就是大多数示例使接口变得平凡的方式)。问题是,实现 IConnection 接口的不同类型的类可能需要不同的数据来建立连接,有些可能需要用户名和密码,有些可能需要某种特殊的连接密钥,有些可能根本不需要。作为契约的Connect方法是完全有效的,因为每个类都需要某种方式来建立连接,但它们需要的数据是不同的。

在这种情况下是否需要接口?如果是,你如何定义Connect方法?如果不是,你如何证明你的具体类仍然是“可扩展的”?

对不起,长时间的咆哮,这已经困扰了我很长一段时间了。大多数人在阅读了著名的设计模式书后,会尝试在他们所做的每一件事中实现每一种可能的模式,而不会费心去弄清楚它是否有帮助。我相信当你面临一个问题时,这种模式应该发挥作用,而不仅仅是为了它。

0 投票
3 回答
14475 浏览

class - 使用 Moq 模拟具体类时如何使用接口参数调用构造函数

我有以下类,它使用构造函数注入:

对于此类中的大多数方法,我只是为IRepositoryandIProvider和构造Moq 模拟Service。但是,该类中有一个方法会调用同一类中的多个其他方法。为了测试这个方法,而不是一起测试所有这些方法,我想测试该方法是否正确调用这些方法并正确处理它们的返回值。

最好的方法是模拟Service. 我以前用 Moq 模拟过具体的课程没有问题。我什至用 Moq 模拟了需要构造函数参数的具体类,没有问题。然而,这是我第一次需要将模拟参数传递给模拟对象的构造函数。自然,我尝试这样做:

但是,这是行不通的。相反,我收到以下错误:

如果Service's 的构造函数采用像ints 和strings 这样的简单参数,这很好用,但如果它采用我正在模拟的接口,则不行。你怎么做到这一点?