- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请给我一些面向对象的正确建议。从继承类访问属性数据的正确方法是什么。
假设有 3 个类:
public abstract class Vehicle
{
public int Id {get; set; }
public int Wheels {get; set; }
public string Name {get; set; }
public string Color {get; set; }
}
public class Car : Vehicle
{
}
public class Truck : Vehicle
{
public int LoadCapacity {get; set; }
}
我的第一个想法是创建某种存储库,为我提供所需的属性。
我认为我需要两种类型的查询:
所以:
public class VehicleRepository
{
ICollection <???> _vehicles;
??? GetVehicle(int Id);
??? GetVehicles(??? vehicleType);
}
那个???是我的未知数。
我的想法是为 IVehicle 添加类似接口(interface)的东西,并用它来实现 Vehicle。结果将类似于:
public class VehicleRepository
{
ICollection <IVehicle> _vehicles;
IVehicle GetVehicle(int Id);
ICollection <IVehicle> GetVehicles(IVehicle vehicleType);
}
这显然行不通。
public IVehicle GetVehicle(int Id)
{
return _vehicles.First(x=>x.Id == Id);
// The above want compile as the interface has no attributes
}
如果我使用 Vehicle 而不是 IVehicle,'First(x=>x.Id == Id)' 将正常工作,但如果车辆是卡车,它不会返回 'LoadCapacity'。
查看 GetVehicles 函数,我在想:
public ICollection <T> GetVehicles <T> ()
{
var vehicles = _vehicles.Where(???);
return vehicles;
}
对于应该放在那里的内容有点迷茫,但我想避免反射(reflection),只阅读程序集和类类型等。
感谢您的任何建议。
最佳答案
要存储和获取 vericles,您需要做的就是:
class VehicleRepository {
List<Vehicle> vehicles;
}
要检索它们,只需使用 IEnumerable<T>.OfType<U>()
:
VehicleRepository repository = ...
repository.vehicles.OfType<Car>(); // This will get you all of the cars
repository.vehicles.OfType<Truck>(); // This will get you all of the trucks
不过,如果你想花哨一些,你可以制作 VehicleRepository
一个完全属于自己的集合,使其实现 IEnumerable<T>
.考虑:
class VehicleRepository : IEnumerable<Vehicle> {
List<Vehicle> vehicles;
public IEnumerator<Vehicle> GetEnumerator() {
return vehicles.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return this.GetEnumerator();
}
}
然后您可以查询集合本身,如:
public static void Main() {
VehicleRepository repository = ...;
// Notice that we skip accessing the vehicles member
// because by implementing IEnumerable<T> this class
// becomes a collection. Now you can use OfType<T> directly.
repository.OfType<Car>();
}
编辑:做类似 GetVehicleByID
的事情,你可以尝试这样的事情:
class VehicleRepository : IEnumerable<Vehicle> {
List<Vehicle> vehicles;
public Vehicle GetVehicleByID(Int32 id) {
return vehicles[id];
}
}
你也可以使用索引器,像这样:
class VehicleRepository : IEnumerable<Vehicle> {
List<Vehicle> vehicles;
public Vehicle this[Int32 id] {
get { return vehicles[id]; }
}
}
获取LoadCapacity
从卡车上,你所要做的就是这样:
public static void Main() {
VehicleRepository repository = ...
// Assuming index zero is a truck
Truck truck = (Truck)repository.GetVehicleByID(0);
truck.LoadCapacity = ...
}
在不使用反射的情况下获取特定类型的所有项目(当绑定(bind)到 UI 时,即假设您使用 Strings
)的一种作弊方法是匹配 ToString
类型名称的值。例如:
public static void Main() {
VehicleRepository repository = ...
// Assume we're storing off the typename in the UI dropdown.
// so that when the user selects it, we automatically have the correct
// type name we want to filter by.
String truckTypeName = typeof(Truck).GetType().ToString();
// Filter only by those types with a matching type name. Inefficient,
// but it does avoid reflection.
repository.Where(vehicle => vehicle.GetType().ToString() == truckTypeName)
}
关于继承属性类的 c# OO 建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19210847/
我相信 OO,但不至于应该使用不适当的设计/实现来实现“OO 兼容”。 那么,如何应对 Serlvet/EJB/DataContainer 分层架构: Servlet 接收请求并调用“业务层”(例如
我有一个员工分为两类(国内和国际)。我还有一个类Refund,是用来给员工退款的。我有一个名为银行账户的类,由 Refund 类用于退款。 现在我的直接设计是这样的: 员工界面,分国内和国际2个子类型
为什么基于类的 OO 而不是基于原型(prototype)的 OO 如此受欢迎?他们在学校教后者吗?尽管 Javascript 是基于原型(prototype)的,但大多数人主要在功能上使用它,或者通
为什么基于类的 OO 而不是基于原型(prototype)的 OO 如此受欢迎?他们在学校教后者吗?尽管 Javascript 是基于原型(prototype)的,但大多数人主要在功能上使用它,或者通
我找不到主要区别。我很困惑什么时候可以使用继承,什么时候可以使用子类型。我找到了一些定义,但它们不是很清楚。 在面向对象编程中,子类型化和继承有什么区别? 最佳答案 除了已经给出的答案,这里还有一个
我想在类中动态定义方法。我正在写一个跟踪器,比下面的框架稍微复杂一些,它也有状态意识,但这与我的问题无关。我写了一个 TraceSlave 类,它带有调用 sprintf 的跟踪方法,用文本\n 替换
如果你看过Going Deep shows of the Channel9最近,一个经常被提及的话题是mathematical duality在编程中。 TomasP 有一个不错的blog post关
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我是软件设计原则的忠实粉丝,例如 固体 和 干 .面向对象软件设计还有哪些其他原则? 笔记。我不是在寻找诸如“评论您的代码”之类的答案,而是在寻找 OO 设计原则,例如 Uncle Bob 讨论的那些
我找不到主要区别。我很困惑什么时候可以使用继承,什么时候可以使用子类型。我找到了一些定义,但它们不是很清楚。 面向对象编程中的子类型和继承有什么区别? 最佳答案 除了已经给出的答案,这里还有一个 li
这个问题已经有答案了: Javascript: Do I need to put this.var for every variable in an object? (6 个回答) 已关闭 9 年前。
我正在构建一个应用程序,该应用程序在一个对象内有一个对象数组,而它的自身位于一个数组中。我希望能够从子对象访问父对象的属性。我知道我可以简单地通过索引引用父级,如下所示: var parents =
我有一个像这样的html页面 和 2 个像这样的 JavaScript 文件 /// /// /// $(document).ready(fu
我正在尝试用 javascript 做一个巨大的 Web 应用程序,如果我不想搞乱一切,我想我必须以面向对象的方式来做。因此,我进行了很多搜索,发现了很多在 JS 中声明类和创建实例的不同方法,例如环
我在理解 OO 模式如何工作时遇到了一些问题,我的讲师给了我以下问题,但我思考了一整天后无法解决它 我的问题的场景。 有一个名为“ShapeManager”的类,用于管理 Shape 对象。名为“Sh
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 1年前关闭。 Improve this
我正在阅读科学 paper关于 Robert martin 编写的 OO Design Quality Metrics。 在他的论文中,他描述了“一组指标,可用于衡量面向对象设计的质量,根据该设计的子
我有一个与 OOP 相关的问题。我有一个界面,说: class MyInterface { public int getValue(); } 在我的项目中,这个接口(interface)由 7
是否有更好的Pythonic/面向对象方法来选择在运行时执行哪个特定类方法,具体取决于对象的类型,因为使用 type() 方法不被认为优雅(?) 我为我正在使用的三种数据类型编写了以下代码。它基本上将
就 Perl OO 而言,-> 到底做了什么? 例如我打了一个主电话: $result = a::b->mymethod( ); 在我定义 mymethod() 的包中,我使用了以下内容: m
我是一名优秀的程序员,十分优秀!