0

我已经用 C#(以及其他一些语言)编程有一段时间了,但最近我决定开始编写自定义类来更好地了解面向对象编程。为此,我从 Vehicle 的基类和一些派生类开始着手处理继承。

我在这里要做的是在 Vehicle 的基类中设置一些默认值和逻辑,同时让派生类实现一些确定差异的信息。例如,当我在基类中设置 _wheelsNumber、_motorType 和 _horsePower 变量和逻辑时,我会让每个类(Car、Truck、Semi、Moped 等)设置其 _wheelsNumber 并触发逻辑流来计算剩下的属性。

但是,我不确定我是否以正确的方式构建了我的课程来实现这些目标。我不清楚我是否使用我的构造函数和我的 get/set 访问器远程做正确的事情(因为我不希望用户选择汽车有多少个轮子之类的东西,我没有声明的集合访问器)。我想我注意到的一件事是,用户必须在电机类型和马力之前询问程序的车轮数量。我认为这是因为它们不是在构造函数中计算的,但我不确定。

任何人的清晰度将不胜感激。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace VehicleClasses
{
    abstract public class Vehicle
    {
        protected const int smallMotor = 1;
        protected const int mediumMotor = 3;
        protected const int largeMotor = 5;
        protected const int largerMotor = 7;
        protected const int hugeMotor = 9;
        protected const int wrongMotor = 9001;

        public Vehicle()
        {
            _horsePower = (_motorType * _motorType) * 8;
        }

        protected int _wheelsNumber;
        public int wheelsNumber
        {
            get
            {
                return _wheelsNumber;
            }
        }

        protected int _motorType;
        public int motorType
        {
            get
            {
                if (_wheelsNumber < 4)
            {
                _motorType = smallMotor;
            }

            else if (_wheelsNumber >= 4 && wheelsNumber <= 6)
            {
                _motorType = mediumMotor;
            }

            else if (_wheelsNumber > 6 && wheelsNumber < 10)
            {
                _motorType = largeMotor;
            }

            else if (_wheelsNumber >= 10 && wheelsNumber < 18)
            {
                _motorType = largerMotor;
            }

            else if (_wheelsNumber >= 18)
            {
                _motorType = hugeMotor;
            }

            else
            {
                _motorType = wrongMotor;
            }                
                return _motorType;
            }
        }

        protected int _horsePower;
        public int horsePower
        {
            get
            {
                return _horsePower;
            }
        }
    }
}
4

1 回答 1

0

这是继承的常见误用。子类应该扩展行为,而不仅仅是修改状态的值。

在您的示例中,只有一个自由变量,即车轮数。其他一切都是基于此的衍生特征。更改车辆的构造函数以将轮数作为参数,然后(如果需要)您可以将公共静态方法添加到类中,例如“CreateMotorcycle()”,以创建具有正确轮数的车辆。

替代建议运动

就像我之前提到的,当您想要扩展行为时,继承很有用。例如,假设您有一个“Employee”基类。为简单起见,假设每个员工都有一个初级和一个高级。

每当员工想要休假时,他们都必须请示上级,但并非每个员工都能批准。请求必须通过链向上传递,直到它到达一个“管理器”,它是一个派生实例。

翻转它,假设最高级的员工是所有者。当他想让公司做某事时,他不会自己做。他将命令向下发送。每一层都可能修改需要做的事情。例如,老板说需要在 365 天内完成,每个经理说有一半的时间告诉他,工人完成任务。

这些示例中的每个“类”(Worker/Manager/Owner)在调用相同的方法时表现不同。但是让它们都实现相同的基类可以很容易地将它们链接在一起!这是“责任链”“装饰者”模式的变体。

于 2013-01-17T20:16:17.713 回答