C# 对此建模的最佳方式是什么(简单的组合,如策略模式或泛型)?
假设我有代表所有汽车(如本田、丰田、福特等)基本等级的carbase。同样地说,我也有卡车基地(所有不同的车辆类别)。还请注意,每辆本田汽车都有一些共同的属性,这些属性由hondabaseobject表示 现在,我想定义一个洪达契维奇;理想情况下,它将是C# 对此建模的最佳方式是什么(简单的组合,如策略模式或泛型)?,c#,.net,vb.net,c#-4.0,c#-3.0,C#,.net,Vb.net,C# 4.0,C# 3.0,假设我有代表所有汽车(如本田、丰田、福特等)基本等级的carbase。同样地说,我也有卡车基地(所有不同的车辆类别)。还请注意,每辆本田汽车都有一些共同的属性,这些属性由hondabaseobject表示 现在,我想定义一个洪达契维奇;理想情况下,它将是hondacivic:hondacar,hondabaseobject,但由于.net不允许多重继承,我正在考虑各种建模方法 对象- 我想访问所有本田汽车与本田基地对象,所有汽车与碳基,所有卡车与卡车基地等 请看下面我提出的模型。我同意,但由于某
hondacivic:hondacar,hondabaseobject
,但由于.net不允许多重继承,我正在考虑各种建模方法
对象-
HondaCivic:HondaCar
——但处理起来很困难,因为我不能简单地将HondaCivic转换为HondaBaseObject
——通过接口,我可以简单地交换类型
看起来它基本上类似于在c中实现多重继承# i、 e.洪达契维奇:卡巴酶,洪达巴塞对象 洪达契维奇:碳基酶,IHondabaseObject { 洪都巴塞; }
class车辆
{
}
///
///所有car的基类(car的公共字段和操作)
///
类别:汽车
{
//零件
虚拟转向{get;}
虚拟空启动CAR(…)
//引擎
}
HondaCar类:碳基酶
{
//覆盖
//专业
}
丰田章男:卡巴酶
{
//覆盖
//专业
}
类别货车基地:车辆
{
//覆盖
//专业
}
HondaTruck类:卡车基地
{
//覆盖
//专业
}
ToyotaTruck类:TruckBase
{
//覆盖
//专业
}
//有必要吗我引入这一点是因为我想用一种类型访问所有类型的hoda车辆
//但是仅仅为了处理而拥有接口是没有意义的?
//我不确定——但是,看起来好像出了什么问题。
接口IHondaBaseObject
{
}
///
///对象,该对象包含每辆本田汽车(如汽车、SUV、卡车、自行车等)的通用属性
///
类HondaBaseObject
:IHondaBaseObject
{
字符串标识{get;set;}
公共覆盖布尔等于(对象对象对象)
{
返回基数等于(obj);
}
公共覆盖int GetHashCode()
{
返回base.GetHashCode();
}
}
//现在,最好的建模方法是什么?我应该使用泛型吗?或者只是一个简单的战略模式?
HondaCivic类:HondaCar,IHondaBaseObject
{
洪达契维奇(洪达巴塞)
{
}
公共对象{get;}
}
只要提出一个假设的例子。请注意,每节课
将有自己的特定字段和操作。例如:a
源自汽车的HondaCar可能完全凌驾于
发动机工作,并有自己的自定义零件
OO开发最佳实践的最新见解是,当类具有不同(或额外)字段/方法时,不使用继承。您应该仅在它们完全可交换时使用它们,因此所有类都符合相同的接口
我建议使用一种具有2个复合材料、ICarBase和类似IIdentifiable的车辆
有关Liskov替代原理的更多信息:
祝你好运。为什么不让所有人都有一个共同的祖先,
车辆
?因为所有东西都是从车辆继承的,所以将所有共享的东西都放在那里。当您沿着继承树向下移动时,事情会变得更加专业化。不需要多重继承。您可能还想考虑使用接口(类可以实现多个接口)。在类型的属性中不同的类名可能不应该是不同的类,而是指示一个属性。品牌应该是一种属性。听起来你应该有一个IHonda
界面。接口也可以从其他接口“继承”。我也怀疑这个想法。考虑一下:为什么不创建诸如“RedCar”、“BlueCar”、“BlackCar”之类的类。。。你可能已经找到了一种在C#中模仿多重继承的方法,但这并不能使设计正确。品牌、发动机类型、座椅类型,这些都是汽车的属性,而不是专门化。谢谢Remco。但是,请注意,并非所有字段/方法都是专用的。举个例子:正如Erno指出的,可以有一些共同的属性,比如颜色,操作,比如镜子的功能等等。这不是说它们有共同点,而是说它们不能有任何不同(“在Liskov替换的上下文中,任何东西”)。我理解,另一个原则也说单一责任,因此,在适当的时候,将这些属性分为一个单独的类,你应该最终得到一辆车,车上有一个像镜子操作员一样的东西,还有一个颜色属性。也许我最近收到的另一个好提示是:你不应该尝试模拟真实世界的对象,但你应该模拟你软件的需求。因此,对于命名、标记等来说,身份可能是一个很好的软件。HondaCivic类只是一个需要身份的类?还是暴露?。就像Erno de Weerd已经说过的,也许你的基本d
class vehicle
{
}
/// <summary>
/// Base class for all the cars (common fields and operations of car)
/// </summary>
class CarBase : vehicle
{
//parts
virtual steering steering {get;}
virtual void StartingTheCar(...)
//engine
}
class HondaCar : CarBase
{
//overrides
//specializations
}
class ToyotaCar : CarBase
{
//overrides
//specializations
}
class TruckBase : vehicle
{
//overrides
//specializations
}
class HondaTruck : TruckBase
{
//overrides
//specializations
}
class ToyotaTruck : TruckBase
{
//overrides
//specializations
}
//Is it necessary? - i introduces this so that as i want to access all types of hoda vehicles with a single type
//but having interface, just for the sake of handling doesnt make sense?
//i am not sure - but, looks like something is wrong.
interface IHondaBaseObject
{
}
/// <summary>
/// Object which contains the common attributes for each honda vehicle (say cars, suvs, trucks, bikes etc...)
/// </summary>
class HondaBaseObject
: IHondaBaseObject
{
string identity { get; set; }
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
//Now what is the best way to model it? should i use generics? or just a simple stragey pattern?
class HondaCivic : HondaCar, IHondaBaseObject
{
HondaCivic(HondaBaseObject ho)
{
}
public HondaBaseObject { get; }
}