Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对此建模的最佳方式是什么(简单的组合,如策略模式或泛型)?_C#_.net_Vb.net_C# 4.0_C# 3.0 - Fatal编程技术网

C# 对此建模的最佳方式是什么(简单的组合,如策略模式或泛型)?

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不允许多重继承,我正在考虑各种建模方法 对象- 我想访问所有本田汽车与本田基地对象,所有汽车与碳基,所有卡车与卡车基地等 请看下面我提出的模型。我同意,但由于某

假设我有代表所有汽车(如本田、丰田、福特等)基本等级的carbase。同样地说,我也有卡车基地(所有不同的车辆类别)。还请注意,每辆本田汽车都有一些共同的属性,这些属性由hondabaseobject表示

现在,我想定义一个洪达契维奇;理想情况下,它将是
hondacivic:hondacar,hondabaseobject
,但由于.net不允许多重继承,我正在考虑各种建模方法

对象-

  • 我想访问所有本田汽车与本田基地对象,所有汽车与碳基,所有卡车与卡车基地等
  • 请看下面我提出的模型。我同意,但由于某些原因,我不喜欢我定义的接口(IHondaBaseObject)

    我刚刚定义了它,以便我可以使用它处理所有本田车辆,因为我知道所有本田车辆都由本田基本对象组成,并执行此合同

    有没有更好的办法处理

    可能类似于
    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; }
            }