使用 C# 进行交互
介绍
OOP 编程中的接口是一个神秘的话题。你问到的每一个经验丰富的程序员都会给你一个略有不同的解释,这取决于他们的经验领域和他们对这个主题的使用。这些答案中最常见的模式是接口是一个抽象和封装的概念。让我们通过电动长板及其控制器的概念来看一下这个主题。
控制器和长板
该装置有一个小型控制器,上面有两个按钮和一个旋转开关。一个按钮用作开启/关闭按钮,另一个按钮用于使发动机反向运转(实际上改变电流的流动)。如果将旋转开关向上推,滑板将加速,如果向下推,滑板将制动车轮。加速度和减速度与开关圆周旋转的长度成正比,因为它可以微调车辆的速度。
控制盒
我们目前拥有的盒子,即控制器,定义了它可以处理的特定输入,并且它们具有针对给定输入产生的输出结果。就像开机、关机、加速、减速等一样……一些罕见的情况还指定了返回类型。在我们的示例中,返回类型并不相关,因为我们只想控制电路板的状态。
这些接口对这些操作的语义没有任何限制。将它们就近记录下来并选择良好的命名约定是一种公认的最佳做法。
更具体地说,我们只能在打开电源的情况下加速或减速滑板。这是基于这样的假设:我们的滑板只能由电动机驱动,而不是在下坡时驱动。即使关闭电源,车轮也可以旋转,但刹车只有在通电时才能工作。
演示标准
该演示程序遵循以下一些规则:
- 您不能将设备打开两次。
- 您不能关闭设备两次。
- 只有当设备静止时,您才可以关闭它。
- 您只能加速已打开的设备,并且只能加速到它达到初始化时指定的最大速度。
- 您只能使设备减速直至其停止!
可控性
有一个惯例是,你应该在接口前面加上I字符,这清楚地标记了意图并帮助程序员更好地理解代码。
我们的接口定义如下:
namespace InterfaceTutorial
{
interface IControllable
{
string State { get; set; }
void Accelerate();
void Decelerate();
}
}
我们有一个公开的状态属性以及加速和减速功能的契约。
在这个演示中,我们收集了InterfaceTutorial命名空间下的所有内容,以便于引用。
车辆
这个类实现了与我们设备的交互。类定义向您展示了允许交互的接口。
class Vehicle : IControllable
我们有一个构造函数,它用默认参数初始化板,以防它们足够好。
public Vehicle(string name = "No Name", int maxspeed = 0, int speed = 0, string state = "off")
{
BoardName = name;
MaxSpeed = maxspeed;
Speed = speed;
State = state;
}
我们有四处公开的房产。
public string BoardName { get; set; }
public int MaxSpeed { get; set; }
public int Speed { get; set; }
public string State { get; set; }
让我们看看我们的 PowerOn 方法。由于设置了条件,我们只允许开机一次。
public void PowerOn()
{
if(State == "on")
{ Console.WriteLine($"The board: {BoardName} is already ON!"); }
else
{
State = "on";
Console.WriteLine($"Powering ON the Board: {BoardName}, currently at {Speed} MPH!");
}
}
断电也符合预期。不两次关闭电路板,并且不允许关闭行驶中的车辆。
public void PowerOff()
{
if(State == "off")
{ Console.WriteLine($"The board: {BoardName} is already OFF!"); }
else {
if(Speed > 0)
{ Console.WriteLine($"You are not allowed to Power OFF a moving board: {BoardName}"); }
else {
State = "off";
Console.WriteLine($"Powering OFF the board: {BoardName}, currently at {Speed} MPH!");
}
}
}
从这个意义上来说,加速和减速函数非常相似。两者都将操作限制在通电的设备上,速度变化保持在 0 到实例化时指定的最大速度之间。
public void Accelerate()
{
if(State == "off")
{ Console.WriteLine($"The board needs to be turned on to pick up speed!"); }
else
{
if (Speed < MaxSpeed)
{
Speed += 10;
Console.WriteLine($"The {BoardName} accelerates towards {Speed} MPH!");
}
else
{ Console.WriteLine($"The {BoardName} reached it's speed limit, continue journey at {MaxSpeed} MPH!"); }
}
}
public void Decelerate()
{
if (State == "off")
{ Console.WriteLine($"The {BoardName} is currently {State}, please dont use it this way as the breaks are not functional!"); }
else
{
if(Speed <= 0)
{
Console.WriteLine($"The {BoardName} has lost all it's speed, came to a halt!");
}
else
{
Speed -= 10;
Console.WriteLine($"The {BoardName} decelerates towards {Speed} MPH!");
}
}
}
此部分代码需要包装在以下代码块内。否则,我们的调用将需要调整才能正常工作。
using System;
namespace InterfaceTutorial
{
}
试驾
现在我们已经完成了如何使用界面控制滑板的演示。首先,我们创建Vehicle实例。它需要两个参数;第一个是我们想要使用的名称,第二个是最大速度。请注意,在初始化期间,此值为 0。因此,如果您不指定限制,则无法骑滑板。
using System;
namespace InterfaceTutorial
{
class Program
{
static void Main(string[] args)
{
Vehicle meepo = new Vehicle("Meepo V2", 40);
if (meepo is IControllable)
{
meepo.Decelerate();
meepo.PowerOn();
meepo.PowerOn();
meepo.Accelerate();
meepo.Accelerate();
meepo.PowerOff();
meepo.Accelerate();
meepo.Accelerate();
meepo.Accelerate();
meepo.Decelerate();
meepo.Decelerate();
meepo.Decelerate();
meepo.Decelerate();
meepo.Decelerate();
meepo.PowerOff();
meepo.PowerOff();
}
else
{
Console.WriteLine($"The {meepo.BoardName} can't be driven");
}
Console.ReadLine();
}
}
}
然后我们将检查设备是否执行了必要的合同并运行它。
运行解决方案将产生以下输出:
The Meepo V2 is currently off, please don’t use it this way as the breaks are not functional!
Powering ON the Board: Meepo V2, currently at 0 MPH!
The board: Meepo V2 is already ON!
The Meepo V2 accelerates towards 10 MPH!
The Meepo V2 accelerates towards 20 MPH!
You are not allowed to Power OFF a moving board: Meepo V2
The Meepo V2 accelerates towards 30 MPH!
The Meepo V2 accelerates towards 40 MPH!
The Meepo V2 reached its speed limit, continue journey at 40 MPH!
The Meepo V2 decelerates towards 30 MPH!
The Meepo V2 decelerates towards 20 MPH!
The Meepo V2 decelerates towards 10 MPH!
The Meepo V2 decelerates towards 0 MPH!
The Meepo V2 has lost all its speed, came to a halt!
Powering OFF the board: Meepo V2, currently at 0 MPH!
The board: Meepo V2 is already OFF!
请注意,与以前一样,第一次调用PowerOn()函数时,我们会收到一条警告,提示刹车不起作用。
通电后,我们能够加速,然后由于设备不静止,因此无法调用 PowerOff ()。然后我们再加速一点,最后达到极限并减速停止。我们的接口还处理两次调用PowerOff() 。
结论
此演示向您展示了允许您控制棋盘的接口的示例实现。当然,任何实现必要合约细节的类都可以使用它。该演示还强调了它们如何协同工作,并为您提供了一些有关扩展此功能的想法。我向您展示了一些语义错误处理,这对您未来的项目很有用。
总而言之,就像汽车一样,界面通过减少或控制系统可以接受的输入类型并为您提供预期的输出来帮助您与环境进行交互。当您向左转动方向盘时,汽车向左行驶,当您向右转动方向盘时,汽车向右行驶。您不必关心变速箱的内部工作原理以及汽车中允许这种运动的其他部件。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~