C# - 我应该使用什么,接口、抽象类还是两者?

2024-03-27

因此,假设我正在用 C# 构建某种房地产应用程序。对于每种类型的财产,我将创建一个类,例如 ResidentialProperty 和 CommercialProperty。这两个类以及所有其他属性类将共享一些公共属性,例如 Id、标题、描述和地址信息。

我希望能够做的是:
a) 返回仅包含基本信息的对象集合
b) 能够调用 GetProperty(id) 等方法,该方法将创建并返回 ResidentialProperty 或 CommercialProperty,或者调用 GetProperties(),该方法将返回其中之一或两者的集合。

因此,创建一个名为 BasicProperty(或 PropertyBase)的抽象类可能是有意义的,它包含所有公共属性,并从它扩展 ResidentialProperty 和 CommercialProperty。这将解决问题 #1,因为我可以创建一个返回 BasicProperties 集合的方法。

但对于#2,能够返回一种属性类型或另一种属性类型,我需要一个接口(IProperty),并让住宅和商业类继承它,然后让 GetProperty(id) 和 GetProperties() 返回IProperty 对象(或者因为它们继承自 IProperty,我可以按原样返回它们而不是作为接口吗?)?

现在,如果我应该使用接口,我该如何处理 BasicProperty 类?
- 我是否将其保留为抽象并实现接口?或者
- 我是否将其保留为抽象并且所有 3 个类都实现该接口?或者
- 我不是将其创建为抽象,将所有基本信息放入接口中,并且BasicProperty、ResidentialProperty和CommercialProperty都实现该接口吗?

提前致谢, 卡尔·J。


虽然我觉得一开始就定义一个接口几乎是always一个好主意,只是因为它可以帮助您的代码在将来变得灵活,听起来在这种情况下您实际上并没有need要做到这一点。你的GetProperty and GetProperties方法可以使用抽象基类作为返回值。

可以这样想:如果我有一个名为GetShape?它大概会返回一个Shape, 正确的?比方说Shape是一个抽象基类,还有一些派生类Triangle, Square, Circle, etc.

不过是个三角形is一个形状,一个正方形is形状等等——其中每一个都恰好超过just一个形状,但他们是形状尽管如此。因此,如果我说“给我一个形状”,而你递给我一个正方形,那么你就按照我的要求做了。那里没有什么有趣的事情。

这是 OOP 的核心基本原则之一:派生类的实例is其基类的实例;这也只是more比起那个来说。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# - 我应该使用什么,接口、抽象类还是两者? 的相关文章

  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 回发或回调参数无效。使用“”启用事件验证

    当我从客户端回发页面时 出现以下错误 我有修改客户端 asp ListBox 的 JavaScript 代码 我们该如何解决这个问题 错误详细信息如下 Server Error in XXX Application Invalid post
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 将自定义 ValueProviderFactories 添加到 ASP.NET MVC3?

    我试图尝试将 Protobuf ValueProviderFactory 添加到 MVC3 以便我可以选择 MIME 类型并将原始数据反序列化为操作参数的对象 我还可以使用它来更改默认的 Json 序列化器 看着JsonValueProvi
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 如何在 Swift 中实现线程安全哈希表(PhoneBook)数据结构?

    我正在尝试实现一个线程安全的 PhoneBook 对象 电话簿应该能够添加一个人 并根据姓名和电话号码查找一个人 从实现的角度来看 这仅涉及两个哈希表 一个关联名称 gt 人员 另一个关联电话 gt 人员 需要注意的是我希望这个对象是线程安
  • 构造函数应该接受参数还是应该创建 setter?

    我有两个选择 要么创建一个在其构造函数中接受大量参数的类 要么创建大量 setter 方法和 init 方法 我不确定哪个是首选选项 构造函数中是否应该接受某些参数 而其他参数可以通过 setter 手动设置 还是我想太多了 这是一个相关的
  • 是否可以在 iOS 模拟器中禁用网络?

    我正在尝试调试在从互联网获取主要数据的应用程序中看到的一些不一致的行为 我在模拟器中没有看到问题 只是在设备上看到问题 因此我想在模拟器中重现网络和连接环境 有没有办法在模拟器中禁用网络 我正在远程连接到 Mac 进行编码 现在没有任何其他
  • Xamarin 表单:图像未以完美圆形显示

    我已经发布了有关此问题的问题 但从未得到任何解决方案 因此 发布相同的问题并提供更多详细信息和发现 对于圆形图像 我在项目中使用 Xam Plugins Forms ImageCircle nuget 包 它在 android 和 wind
  • 如何拯救 OmniAuth::Strategies::OAuth2::CallbackError?

    我正在构建一个 Rails 应用程序Omniauth https github com intridea omniauth用于登录服务 为了验证我正在使用的 GoogleOmniAuth Google OAuth2 策略 https git
  • 如何设置 Kibana SSO(通过 OAuth)? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我的公司非常努力地为所有第三方服务保留 SSO 我想让 Kibana 与我们的 Google Apps 帐户一起使用 那可能吗 如何
  • 在 YML 中为 jpa 设置 hibernate 方言

    我尝试在 YML 中为 jpa 设置 hibernate 方言 检查了很多主题 但没有设置 spring datasource hikari allow pool suspension true connection timeout 100
  • 如何枚举实现通用接口的所有项目?

    我有两个接口 一个通用接口和一个非通用接口 它们具有继承层次结构 public interface IGenericRelation
  • Python pandas 将数据融合到多个列和另一列中的列名称

    我有一个数据框 我想将数据融合到多个目标列中 我使用的下面的代码 grp2 pd lreshape grp1 cols groupby cols str split str 1 sort values ACCT NAME 上面的行我丢失了列
  • 获取最近创建的 Pod 的名称

    在OpenShift中 是否有一种更优雅的方式来获取应用程序中最近创建的pod的名称my app比这个 name oc get pods l app my app o jsonpath range items status startTim
  • 是否有在 Spring 上下文 XML 文件中创建字符串常量的简写?

    我需要在 Spring 上下文 XML 文件中定义一个由多个 bean 共享的字符串值 我就是这样做的
  • 在数据注释的ErrorMessage属性中使用html

    任何人都知道是否可以执行以下操作 public class User public Guid UserID get set Required ErrorMessage A school selection is required Range
  • HTTP 状态代码 411 - 需要长度

    我尝试从服务器获取数据 我使用 NSURLConnectionDelegate NSURLConnectionDataDelegate 有代码 目标 C void sendRequest NSURL url NSURL alloc init
  • 如何获得 Mac 操作系统上的峰值内存?

    在 Windows 中 我可以通过调用 GetProcessMemoryInfo 获取峰值内存使用情况 function TProcess Peek Cardinal var PMC PPROCESS MEMORY COUNTERS PMC
  • 如何转义 NSString 以在 NSURL 中使用? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 到目前为止我的发送按钮得到了这个代码
  • 何时使用 ko.utils.unwrapObservable?

    我使用 KnockoutJS 编写了一些自定义绑定 我仍然不确定何时使用ko utils unwrapObservable item 查看代码 该调用基本上检查是否item是一个可观察的 如果是 则返回value 如果不是 则返回value
  • 如何从asp.net中的复选框列表控件返回选定的项目

    我试图以字符串形式返回动态绑定的复选框列表控件中选定的项目 但没有成功 我希望有人能提供帮助 在我的代码隐藏文件中 我连接到一个名为 users 的类并构建一个数据表 然后我将数据表绑定到 cblist 控件 private void po
  • Bootstrap 模式:背景在切换时跳到顶部

    我有一个模态问题 我在页面上有一个按钮 可以切换模式 当模式出现时 页面跳转到顶部 我已尽一切努力寻找解决方案 等等 但我真的迷失了 EDIT 我也尝试过 myModal modal show 但它具有完全相同的效果 当模态打开时modal
  • 没有找到处理意图的活动?

    我正在编写一个程序 当特定的短信到达手机时 应调用应用程序中的主要活动 我已经注册了一个BroadcastReceiver调用该活动的意图是onReceive 方法 问题是 每次我发送这条特定的短信时 我都会收到强制关闭消息 阅读 logc
  • C# - 我应该使用什么,接口、抽象类还是两者?

    因此 假设我正在用 C 构建某种房地产应用程序 对于每种类型的财产 我将创建一个类 例如 ResidentialProperty 和 CommercialProperty 这两个类以及所有其他属性类将共享一些公共属性 例如 Id 标题 描述