问题标签 [abstract-class]

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 回答
23588 浏览

c# - 在 C# 中的基本构造函数之前执行派生构造函数

我的问题是我想将一个对象传递给派生类,但必须在基类构造函数之前完成,因为基类会立即调用派生类Start()使用该对象的方法。

这是基类的摘录,(为方便起见,从BarcodeScanner重命名)。

这是我正在创建的派生类。

我怀疑您是否可以让 C# 在基本构造函数之前执行派生构造函数;所以我真的只是在寻找一种解决方案,在使用对象之前将对象传递给派生类。

我通过将 Initialize/Start if 块放在MyDerived构造函数中来解决这个问题。但是,还有其他类派生自基类;所以我最终不得不在每个派生类中重复这个初始化/启动代码块。我希望看到修改基类的替代方法。

0 投票
1 回答
732 浏览

python - 封装与继承,帮助做出选择

我需要为几种不同的案例类型(在 Python 中)编写处理程序。所有这些类型的接口都是相同的,但处理逻辑不同。

一种选择是定义一个公共类,该类接收特定的处理程序类型作为 __init__ 参数之一:

但是,这会导致 TypeError:

TypeError:必须使用 Handler_Case1 实例作为第一个参数调用未绑定的方法 handleStuff()(改为获取元组实例)

另一种选择是模仿抽象函数,如下所示 “问:你能在 Python 中用 0 行代码实现抽象类吗?”):

所以,实际上,我有两个问题:

  1. 这两种方法中哪一种更pythonic?和
  2. 如何实现第一个?
0 投票
4 回答
170609 浏览

c# - 接口与抽象类

在 C# 中,什么时候应该使用接口,什么时候应该使用抽象类?什么可能是决定因素?

0 投票
2 回答
2180 浏览

linq-to-sql - 抽象类中的分部方法 (C#)

我正在创建一个可以在 LINQ to SQL 类的部分类中继承的抽象类。LINQ to SQL 类包含一堆内置的分部方法。有没有一种方法可以实现抽象类中的一个或多个部分方法?我知道部分方法只能包含在部分类或结构中。我确信必须有另一种方法来做到这一点。

这里有更多细节:

  • 我可能有一个名为 News 的数据库表。如果我创建一个包含此表的 LINQ to SQL dbml 文件,自动生成的代码会为 News 生成一个部分类。
  • 这个分部类包含几个分部方法。
  • 我有一个正在构建的类,其中包含我想在我的所有 LINQ to SQL 类中使用的几种方法。
  • 其中一种方法是添加到每个 LINQ to SQL 类的部分方法。我有一个共同的身体可用于这种方法。与其将这个方法添加到每个部分类中,我正在寻找一种方法来创建它一次并使用我的基类继承来继承它。

希望这有助于解释更多。

0 投票
3 回答
2245 浏览

c# - 通过构造函数在 IoC 中强制执行依赖关系?

我试图接受使用 IoC/依赖注入,同时对合同而不是特定类进行编程。我面临的困境是以下之间的紧张关系:

  1. 为 IoC 进行接口编程:我从 IoC 开始,严重依赖接口。从 Spring 的示例项目来看,接口是使用 IoC 进行合约编程时要走的路。

  2. ...虽然抽象类通常更受欢迎:接口的主要缺点是在允许 API 的演变方面,它们的灵活性远低于类

  3. 一定要通过构造函数显式地显示类依赖关系 我的直觉是,将依赖关系传递给类的构造函数是一种很好的编程习惯。实际上,这依赖注入。

  4. ...除非您不能在接口/抽象类中强制执行构造函数签名:接口或抽象类都不允许定义构造函数签名(轻松/优雅)。另请参阅框架设计指南第 4.4 节: 不要在抽象类型中定义公共或受保护的内部构造函数。...仅当用户需要创建该类型的实例时,构造函数才应该是公共的。

这个问题与之前的stackoverflow问题有关:定义构造函数签名的接口?

但我的问题是:

由于您不能在 C# 接口/抽象类中定义构造函数,正如上面的问题所问的那样,在实际层面上:

您如何将此与通过构造函数传递依赖项的明智做法相协调?

编辑:谢谢你的答案。我希望对在这种情况下我应该做什么有所了解。只是不使用构造函数参数?使用某种具有依赖关系的 Init() 方法?Edit2:感谢您的出色回答,非常有帮助。

0 投票
35 回答
745079 浏览

oop - 接口 vs 抽象类(通用 OO)

我最近接受了两次电话采访,被问及接口和抽象类之间的区别。我已经解释了我能想到的每个方面,但似乎他们在等我提一些具体的东西,我不知道它是什么。

根据我的经验,我认为以下是正确的。如果我遗漏了一个要点,请告诉我。

界面:

接口中声明的每一个方法都必须在子类中实现。接口中只能存在事件、委托、属性 (C#) 和方法。一个类可以实现多个接口。

抽象类:

只有抽象方法必须由子类实现。抽象类可以具有带有实现的普通方法。除了事件、委托、属性和方法之外,抽象类还可以具有类变量。由于 C# 中不存在多重继承,一个类只能实现一个抽象类。

  1. 毕竟,面试官提出了一个问题“如果你有一个只有抽象方法的抽象类怎么办?这与接口有什么不同?” 我不知道答案,但我认为这是上面提到的继承对吗?

  2. 另一位面试官问我,如果你在接口中有一个公共变量,那与抽象类有什么不同?我坚持你不能在接口内有一个公共变量。我不知道他想听什么,但他也不满意。

另见

0 投票
3 回答
3575 浏览

c# - 将派生类传递给采用抽象类型的 Web 服务方法

我有一个奇怪的问题正在困扰我。

我在一个项目中定义了以下类:

现在,如果我尝试这样的事情,它会按预期工作:

现在我有另一个公开 Web 方法的项目。此方法采用 AbstractUnitModel 并远程执行它,然后将结果发送回客户端。所以在服务器上我有这个:

在客户端我有这个:

但是我的项目无法编译,并且出现以下错误: 错误 109 'CalibrationClient.UnitModelRemoteServer.RemoteModelExecutionWebService.remotelyExecuteUnitModelAsync(CalibrationClient.UnitModelRemoteServer.AbstractUnitModel)' 的最佳重载方法匹配有一些无效参数

错误 110 参数“1”:无法从“UnitModelWrapperInterface.BlastFurnaceUnitModel”转换为“CalibrationClient.UnitModelRemoteServer.AbstractUnitModel”

我不知道为什么会这样。我在服务器项目中有对定义 AbstractUnitModel 的命名空间的引用。唯一让我觉得有点好笑的是,它使用的是“CalibrationClient”命名空间中的 AbstractUnitModel,而不是 UnitModelWrapperInterface。似乎当 VS 在客户端为 Web 服务生成代理时,它会创建 AbstractUnitModel 的部分抽象实现。这是我问题的根源吗?如果是这样,我该如何解决它?

编辑解决方案:正如所指出的,客户端需要了解可以通过网络发送的所有类。我最终通过删除生成的代理类并引用公共库来解决这个问题。在这种情况下不理想但足够好。

0 投票
5 回答
358 浏览

c# - 关于重构为抽象类的基本问题

这可能是一个初学者的问题,但是否有一种标准方法可以将 Wheel 属性的副本重构到抽象类中,但仍保持对 Part 类型的显式转换。假设我们必须防止将 FastCarWheel 放在 SlowCar 上,并且有很多属性就像这个一样。

在这种情况下,只允许这种类型的复制是否很常见?我正在考虑使用泛型,但似乎我正在解决这个问题,并且对于每个以这种方式运行的附加属性来说,情况会变得更糟。

谢谢

0 投票
3 回答
4061 浏览

.net - 接口 + 扩展(mixin)与基类

接口+扩展方法(mixin)比抽象类更可取吗?

如果您的答案是“取决于”,它取决于什么?

我看到接口+扩展方法有两个可能的优势。

  • 接口是可多重继承的,而类则不是。
  • 您可以使用扩展方法以非破坏方式扩展接口。(实现您的接口的客户端将获得您的新基本实现,但仍然能够覆盖它。)

我还没有想到这种方法的缺点。接口+扩展方法失败的原因可能非常简单。

关于这个主题的两篇有用的文章是

0 投票
5 回答
19452 浏览

c# - 类既扩展了抽象类又实现了接口

如果我有一个既扩展抽象类又实现接口的类,例如:

我怎样才能初始化这个类,以便我可以从接口和抽象类访问方法?

当我做:

我无法从界面访问方法。