问题标签 [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 投票
9 回答
323 浏览

language-agnostic - 抽象基类何时可以拥有(非静态)数据成员?

我想问题标题总结了它。是否有一段时间认为 ABC 拥有数据成员是好的设计?我一直想知道是否存在这样的情况。我唯一能想到的都是静态的,即使这样也有点牵强。

0 投票
7 回答
22969 浏览

oop - 抽象类 vs. 接口 vs. mixins

有人可以向我解释一下抽象类接口mixins之间的区别吗?我以前在我的代码中使用过每个,但我不知道技术差异。

0 投票
3 回答
1764 浏览

vb.net - MustInherit 和共享函数

MustInherit我正在查看一个声明(abstract我相信在 C# 中)的 VB.NET 类(我没有编写),它具有三个方法,所有这些方法都定义为Sharedstatic在 C# 中)。类中没有属性或字段 - 只有三个方法。从 OO 的角度来看,这有意义吗?

我的想法是否定的,因为通过 make 它MustInherit,您实际上是在说您不能创建此类的实例 - 您必须从它继承并创建派生类的实例。但是由于所有方法都是共享的,所以无论如何你永远不会真正创建父类的实例,所以MustInherit没有好处。你最好不要标记它MustInherit,只要你愿意就从它继承。

是否存在以这种方式创建类有意义的情况?

0 投票
1 回答
115 浏览

.net - 使用抽象基类时在哪里进行独特的调整

我在决定走哪条路时遇到了一些麻烦......
我有这个应用程序,它由一个基础项目和一个应用程序项目组成,应用程序项目包含针对特定系统的代码,系统应用程序。

基础项目是一个包含抽象方法的抽象类,每个系统特定的应用项目都实现这些抽象方法。
问题是系统应用程序项目可能/将有客户特定的调整,我不想将此代码放在系统应用程序程序集中。

我不确定从哪里开始或如何以一种为未来安全、易于维护的方式完成此任务,并且我是否可以在不重写系统应用程序程序集的情况下添加更多客户特定的代码。

这个想法是有一个基础项目(dll),每个系统有一个系统应用程序项目(dll),然后将客户特定的调整放在一个客户独特的项目(dll)中。
Rob.Core.dll
Rob.Application.BigSystem.dll
Rob.Application.BigSystem.Customer.BigCompany.dll

Rob.Core.dll是基础抽象项目。
Rob.Application.BigSystem.dll是一个特定于系统的项目 ( BigSystem ),派生自Rob.Core.dll
Rob.Application.BigSystem.dll应检查当前客户BigCompany是否有任何独特的调整,如果有,则加载Rob.Application.BigSystem.Customer.BigCompany.dll程序集,该程序集可能包含方法的覆盖或对象的扩展、额外字段等等

好吧,是时候总结一下了……
我不确定该走哪条路,我可以创建一个基础项目(抽象),并从每个系统特定的项目中派生出这个,似乎这是开始的方式。
然后为每个客户创建一个具有一组独特调整的新项目,并覆盖系统特定项目中的所有方法。
那么问题来了,哪个项目是在运行时执行的?系统特定项目还是客户独特项目?
如果系统特定项目执行它应该如何加载所有客户调整(如果有的话,不是每个客户都有独特的调整)?

这是一个很大的问题,但我希望有一些技巧可以帮助我编写架构。

最好的问候
罗伯特

0 投票
2 回答
3664 浏览

c# - Web 服务 - XmlInclude 在派生类而不是基类中?

我在 Web 服务调用中使用抽象类作为参数。目前,我在基类中包含派生类的 XmlInclude,如下所示:

但是,我宁愿不在基类中包含所有派生类型。

http://www.pluralsight.com/community/blogs/craig/archive/2004/07/08/1580.aspx中,作者提到了另一种选择——将属性写在 web 方法之上,如下所示:

但是,我也不想将派生类型放入 Web 服务中。有没有办法将属性保留在派生类型中?

0 投票
3 回答
6251 浏览

c# - 抽象新/虚拟/覆盖/抽象关键字的一些真实示例是什么?

我正在从 PHP 迁移到 C#。

在 PHP 中,使用抽象类创建“级联覆盖”模式非常简单明了,基本上“除非继承类具有具有相同签名的方法,否则基类方法将处理它”。

然而,在 C# 中,我只花了大约 20 分钟在类和继承类中尝试了关键字newvirtualabstractoverride的各种组合,直到我最终得到了执行这种简单级联覆盖模式的正确组合。

因此,即使下面的代码按照我想要的方式工作,这些添加的关键字也向我表明 C# 可以用抽象类做更多的事情。我已经查看了这些关键字的示例并基本上了解了它们的作用,但仍然无法想象除了这种简单的“级联覆盖”模式之外我会使用它们的真实场景。您在日常编程中实现这些关键字的实际方法有哪些?

有效的代码:

0 投票
5 回答
4917 浏览

c# - LINQ to SQL - 使用抽象基类时的映射异常

问题:我想在多个程序集之间共享代码。此共享代码需要与 LINQ to SQL 映射的类一起使用。

我在这里遇到了同样的问题,但我也找到了一个我觉得麻烦的解决方法(我不会说“错误”)。

以下所有代码都可以在此解决方案中下载。

鉴于此表:

和这个 DBML 映射:

我在一个“共享”程序集中创建了以下基类:

这些类在另一个程序集“Main”中引用,如下所示:

DBML 文件也位于“Main”程序集中。

调用时User.FindByName_Broken(db, "test"),抛出异常:

System.InvalidOperationException:类成员 UserBase.Name 未映射。

但是,其他两个基本静态方法有效。

此外,调用生成的 SQLUser.FindByName_Works(db, "test")正是我们在中断调用中所希望的:

虽然我愿意将此1 == 1“hack”用于单个谓词查询,但是否有更好的方法在基本/共享/核心程序集中共享 LINQ to SQL 感知代码?

0 投票
3 回答
481 浏览

c++ - 类 COM 接口警告非虚拟析构函数

有没有办法告诉 gcc 它正在编译的抽象类不需要虚拟析构函数(就像 COM 对象从来没有一样)?例如 nsISupports 总是抱怨缺少虚拟析构函数。关闭警告无济于事,因为我可能有非 COM 类,我想要这个警告。

因此 __attribute__((com_interface)) 已被弃用,仅更改了 vtable 布局。是否还有另一个 __attribute__ 可以告诉编译器我不想被警告该类缺少析构函数?

0 投票
5 回答
760 浏览

c# - 如何模拟多重继承并使用反射来优化此代码?

我有一个 WPF 应用程序,其中PageItems是模型对象。

我的主要 ViewModel 有一个PageItemViewModels的 ObservableCollection ,每个都从其匹配的 PageItem 模型对象构建自己。

每个PageItemViewModel 都继承自抽象类BaseViewModel以获得 INotifyPropertyChanged 功能。

每个PageItemViewModel还实现IPageItemViewModel以确保它具有所需的属性。

我最终将有大约 50 页,所以我想消除任何不必要的代码

  • 已解决(见下文):有没有办法让 PageItemViewModel 类继承 IdCode 和 Title,所以我不必在每个类中实现它们?我不能把它们放在 BaseViewModel 中,因为其他 ViewModel 继承它不需要这些属性,我不能把它们放在 IPageItemViewModel 中,因为它只是一个接口。我知道我需要C# 不支持的多重继承
  • 已解决(见下文):有没有办法摆脱switch语句,例如以某种方式使用反射

下面是一个独立的控制台应用程序,它演示了我在WPF应用程序中的代码:

重构:接口改为抽象类

消除 Switch 语句的答案:

谢谢戳:

0 投票
5 回答
1590 浏览

c# - C# 继承

假设我有以下代码:

问题是我希望ASomeAbstractImpl.DoSomething()方法密封(最终),所以没有其他类可以实现它。由于代码现在SomeImpl可以调用一个DoSomething()可以调用的方法(它不会覆盖抽象类中具有相同名称的方法,因为它没有被标记为虚拟),但我想切断实现的可能性课堂上有这样的方法SomeImpl

这可能吗?