问题标签 [abstract]
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.
.net - 使用 Windows 窗体作为抽象类 - 使用哪种模式?
我正在与一次又一次出现的情况作斗争,但我不确定我做事的方式是否错误,或者我是否可以以不同的方式做事。
一个例子:
我有一个 Windows 窗体,它有一个带有一些私有方法的 DataGridView 来执行数据网格的验证和解释鼠标右键单击 datagridview 等。这个窗体本质上是一个“抽象”类,从不直接实例化。
然后我从这个基类继承并以各种方式(模板模式)对其进行自定义,例如定义 datagridview 的列和特定于这些列的特定格式化方法等。
当我使用这些类时,基类公共方法形成我的接口,我可以实例化我想要的特定类型的 datagridview 并通过公共接口操作它。迷人的。
问题:
主要问题是,您实际上不能将 Windows 窗体类声明为抽象类,而不会导致 Visual Studio 设计器因为它无法实例化这些抽象类而产生不稳定。
一些解决方案:
目前,我正在“实现”我想要覆盖的基类中的那些方法:
所以至少如果我忘记覆盖形成我的界面的这些方法之一。不过,这对我来说似乎很臭,我真的不喜欢它。
我玩弄的另一个解决方案是完全取消继承并定义一个接口(例如 IMyDataGrid)并在每个 datagridview 类中实现它(某种策略模式)。但是这里的问题是您失去了代码重用的好处,继承给您的意思是您必须创建许多不同的表单,在它们上放置一个 datagridview - 有效地将相同的代码复制并粘贴到每个表单中。坏的。
有没有更好的方法来实现这一目标?
c# - 抽象基类的重写属性引发的堆栈溢出异常
我有一个带有以下(为简洁起见)声明的基类:
以下类使用它:
现在,当我将我的特定对象绑定到我的模型(我的实现恰好是 MVC)时,如果我只访问 RecordID 和 ObjectName,则返回对象就好了,但是如果我的 get 或 set 访问器(覆盖)状态被击中。
我已经在 SO 上找到了类似的问题...
为什么 Property Set 会抛出 StackOverflow 异常?
...但是通过自动属性实现,我的代码看起来是正确的并且不会创建无限循环(但这似乎是这种情况)。关于如何正确覆盖该属性的任何想法?
谢谢!
java - 处理异常的业务委托
我对关于业务代表的一句话感到困惑:
业务代表处理和抽象任何远程异常
这里的“抽象”一词是什么意思?它只是提供细节而不是如何实施它们吗?
.net - 抽象类的序列化
我正在尝试序列化,但我正面临抽象类的问题。
我用谷歌搜索了答案,我发现了这个 blogitem。我试过那个和那个工作。
好的,很不错。但请查看对该项目的评论:
这种方法似乎隐藏了真正的问题,那就是OO设计模式的不准确实现,即工厂模式。
不得不改变基类来引用任何新的工厂类是弄巧成拙的。
稍加考虑,代码可以更改为任何派生类型都可以与抽象类关联(通过接口的奇迹),并且不需要 XmlInclude。
我建议进一步研究工厂模式,这似乎是您在此处尝试实现的。
评论者在说什么?他有点模糊。有人可以更详细地解释它(举例)吗?还是他只是在胡说八道?
更新(阅读第一个答案后)
评论员为什么说
工厂模式
和
可以将代码更改为可以将任何派生类型与抽象类关联的地方(通过接口的奇迹)
?
他要不要做一个界面,像这样?
c# - 来自抽象方法的协变返回类型的问题
我正在尝试结束对抽象方法和返回类型协方差的两天抨击,我已经发布了两个类似的问题,我永远感谢社区提供的信息,我只需要最后一次推动即可终点线。这是我想要做的:2 个抽象类,RecruiterBase 和 CandidateBase,它们都有 RecruiterA 和 CandidateA 的 concreate 实现。RecruiterBase 有一个抽象方法可以让所有被招募的候选人返回 IQueryable。我的 RecruiterA 实现覆盖了 GetCandidates() 方法以返回 IQueryable。
和实现:
尝试编译会引发编译时错误,因为在我的 RecruitreBase 实现中,GetCandidates() 方法返回IQueryable<CandidateA>
而不是IQueryable<CandidateBase
>。
在无法从上一个问题(抽象/虚拟方法中的通用返回类型)中获得建议后,我做了很多阅读,并在 SO 中遇到了以下问题
这最终让我意识到我一直在寻找的是一种为我的返回类型实现协方差的方法。我使用了 Marc Gravell 的片段......
...作为我解决方案的基础。所以现在我的 RecruiterBase 和 RecruiterA 类看起来像:
和我的实现......
我希望最终能得到我想要的东西,但我在以下代码中遇到了编译时错误,因为 GetCandidates() 无法将 CandidateA 隐式转换为 CandidateBase:
所以我添加了一个演员表:
然后一切都会编译,但是当我在控制器中实际调用 GetCandidates() 时,它会返回IQueryable<CandidateBase>
而不是IQueryable<CandidateA>
. 所以我回到了我开始的地方。
如果你能做到这一点并且你能帮助我,我会给你送 12 包你最喜欢的啤酒!
c# - c# 抽象基类中的属性
我有一个我无法解决的奇怪问题。当我尝试编译以下片段时,我收到此错误:
“AbstractClass”未实现接口成员“Property”(编译器错误 CS0535)
在线帮助告诉我让我的 AbstractClass 抽象,它就是这样。谁能告诉我哪里出错了?
干杯吕迪格
c# - 如何将 Linq 结果投影到抽象构造函数中?
是的,这是我连续第四天问一个关于摘要的问题,对不起,我会试着去回答一些关于 SQLServer 的问题,以回馈社区。反正...
如何将 Linq 查询的结果投影到抽象基类集合中?这是我的 RecruiterBase 抽象类中的我的方法(还有一个相应的 CandidateBase 抽象类):
上述方法会抛出编译时错误,即无法在 Candidate 和 CandidateBase 之间进行隐式转换。
将 db.Candidates 修改为 db.Candidates.Cast() 可以编译所有内容,但我得到一个运行时错误,即在类型 Candidate 和 CandidateBase 之间未定义强制运算符。
我做不到:选择 New CandidateBase { ... } 作为 CandidateBase,因为无法实现抽象。
我也不能在候选人和候选人基础之间创建一个显式转换运算符,因为它再次要求我更新我的摘要
我也不能将我的结果投影到匿名对象中,然后转换为 CandidateBase,因为我在匿名类型和 CandidateBase 类型之间得到相同的运行时强制异常。
这个问题来自昨天的问题, Problem with Covariant return types from an abstract method
Stan R 提供的答案是我让事情变得复杂。我回去,简化了一切(我将实现留在基础中并将其从潜艇中删除)并最终实现了一个有效的 GetCanidates 方法,如下所示:
上面的方法编译并工作,我不想在嘴里看礼物马,但现在我在我的基本类型中引用了我的子类型(当我将结果投影到 CandidateA 中时),这看起来很奇怪。如果从基本类型中引用子类型是可以的,请随意对我的问题投反对票。
谢谢。
全类定义:
diagram - 代码的视觉/艺术表现
不知道这个有没有名字。我感兴趣的是有什么样的图形程序可以以高级、抽象和美观的方式表示代码或代码开发。
我所知道的唯一这样的例子是我不久前看到的一个视频,它使用发光的球体在存储库中移动来显示用户代码活动围绕一个大型开源项目——尽管我再也找不到它了。
如果这个问题太含糊,我很抱歉。昨晚我只是在思考如何将项目骨架作为图片展示给某人,以及是否可以以一种让他们一眼就能识别出代码库的一般形状和/或整洁度的方式来做。如果你可以看到一个项目成长,它会是什么样子?编写解析器来完成此任务有哪些问题(如果有)?
我正在寻找比 UML 图更抽象的东西!
c++ - C ++中的虚函数实例化有什么区别?
以下两个声明有什么区别?
我读到第一个(= 0)是一个“纯抽象函数”,但是第二个是什么?
c++ - 在 C++ 中,如何保存抽象类的列表?
我有两个实现的类:
两者都是双向发送和接收的协议消息。
现在在协议实现中,我需要创建一个消息队列,但由于DCMessage
是抽象的,它不会让我做这样的事情:
问题在于,正如编译器所说,“DCMessage 无法实例化”,因为它有一个纯抽象方法:
删除=0
并放入空花括号DCMessage.cpp
可以解决问题,但这只是一个技巧。
另一个解决方案是我应该制作两个 DCMsgQueues:DCCmdQueue
和DCReplyQueue
,但这只是重复的代码,用于一些琐碎的事情。有任何想法吗?=)