我今年57岁。除了使用C#分析文本数据之外,我对C#的了解非常有限。但是,偶尔我会尝试学习C#的其他方面。我也更喜欢理解为Windows应用程序而不是控制台应用程序创建的代码。
任何人都可以详细说明下面给出的代码,它是从MSDN网站上获得的,带有简单的实际示例,以便我可以从中学到一些东西。我想我需要创建另一个类但是如何实现它并从C#中的按钮调用它。为什么他们说只有派生类可以调用“AddGas”。提前谢谢。
abstract class Motorcycle
{
// Anyone can call this.
public void StartEngine() {/* Method statements here */ }
// Only derived classes can call this.
protected void AddGas(int gallons) { /* Method statements here */ }
// Derived classes can override the base class implementation.
public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }
// Derived classes must implement this.
public abstract double GetTopSpeed();
}
答案 0 :(得分:2)
假设你要创建一个特定的Motorcycle
,例如Yamaha
,它有另一种返回摩托车颜色的方法。对于您想要创建的每辆摩托车,您可以从头开始在Motorcycle
中创建所有方法,而不是从下面继承:
public class Yamaha : Motorcycle
{
public string GetColor()
{
// ....
return "Red";
}
// When a method in class is marked as abstract,
// all the class that inherit should provide an implementation
// of this method. Otherwise you would get a compilation error.
public double GetTopSpeed()
{
return 200;
}
// When a method is marked as virtual, we have two options for the derived classes.
// 1. Use the implementation provided int the base class.
// 2. Override this implementation, define a method like below and provide
// your implementation.
public override int Drive(int miles, int speed)
{
/* Method statements here */ return 2;
}
}
此外,重要的是要注意,不能实例化抽象类(您不能将对象创建为new Motorcycle()
)。
为什么他们说只有派生类可以调用'AddGas'?
因为AddGas
被标记为protected
。阅读C#中的访问修饰符可以使这个和其他相关的事情更加清晰。
答案 1 :(得分:1)
抽象类只是制作某些内容的模板或指南。
在您的示例中,它是如何制作摩托车的指南。您实际上创建摩托车。你不能进入经销商并请一辆摩托车。
本田?川崎? 150CC? 650CC?什么?
您的导游告诉您:
*public* void StartEngine()
)*protected* void AddPetrol(int litres)
)*public* virtual int Drive(int miles, int speed)
)*public* abstract double GetTopSpeed()
)从这里,我们可以看到任何人可以启动它,驱动它,并获得它的最高速度。
我们还可以看到自行车本身可以添加一些汽油(毕竟它是内部内燃机)。
你决定使用本田。为什么?因为那是第一个想到的Make。所以你在那边问那个。推销员告诉你啊,这是一个很好的入门者,没有多余的装饰,没有额外的东西,它只是有效。它是
public class HondaBasic : Motorcycle {
public override double GetTopSpeed()
{
return 60.0;
{
}
很可爱!你应该把它拿出来......
static void Main(string[] args)
{
// "Aww, it looks like something a child would ride!"
var bike = new HondaBasic();
bike.StartEngine();
// "Wow, is that in MPH or Km/h? Either way I could run faster than that!"
var top = bike.GetTopSpeed();
// "Well, lets take it for a spin, at least..."
bike.StartEngine();
var driven = bike.Drive(3, 30);
}
所以,你去了,你带着你的本田Basic进行试驾,以30英里/小时的速度行驶3英里。
我会在这里采取自由,并假设Drive返回实际驾驶的时间,因为我觉得时间是你给出速度和距离时所得到的。
显然你计划以30英里/小时的速度外出3英里,而你显然是为了...... 1.因为那就是你所说的......
public virtual int Drive(int miles, int speed) { return 1; }
driven
== 1因为基类只是一直返回1!我怀疑你管理3英里 - 每小时30英里 - 1分钟?第二?不重要。
我猜因为没有什么可以调用AddGas,它可能只用了1分钟后才会用完第二个?...
嗯,那太糟糕了。为什么他们甚至制作那个模型?好吧,角落里那个甜蜜的东西怎么样?它有光泽!并且看起来好像它实际上由那些知道......任何东西的人建立,说实话。
public class KawasakiNinja : Motorcycle {
private int _gas;
public KawasakiNinja()
{
_gas = 100;
}
public override int Drive(int miles, int speed)
{
var timeWhateverValue = miles / speed;
_gas -= timeWhateverValue;
return timeWhateverValue;
}
public override double GetTopSpeed()
{
return 300;
}
protected override void AddGas(int gallons)
{
_gas += gallons;
}
public void FillErUp(int gallons)
{
AddGas(gallons);
}
}
那么好吧......这辆自行车实际上看起来不仅仅是带轮子的一次性相机。它实际上可以填满!
听起来不错!让我们带她旋转吧!
static void Main(string[] args)
{
// "Mmm, shiny"
var bike = new KawasakiNinja();
// "Purrs like a kitten!"
bike.StartEngine();
// "How fast?!"
var top = bike.GetTopSpeed();
// "Sweet..."
var driven = bike.Drive(1, 300);
// "Holy cap it really can go 300! I bet it burns up fuel like there's no tomorrow, though! Let's pull over"
bike.FillErUp(50);
// "Enough to get back to the lot"
driven = bike.Drive(1, 40);
}
非常喜欢冒险 - 以每小时300英里的速度燃烧一英里!根据川崎(我们的)数学,你在0分钟?秒钟开车吗?
Aaaand它有办法填充坦克(坦率地说,这个模型实际上有坦克)。
所以,有一些适合你的东西。
abstract class
本身只描述了如何做事。它可能包含也可能不包含任何实际功能;
Drive
方法并实现了它 - 虽然是基本的方式GetTopSpeed
方法,但不实现了它(abstract
)。这个方法需要在抽象类中生成的任何东西中实现 - 如果你错过了,编译器会向你抱怨,所以它很容易不会错过从抽象类派生的任何内容都可以访问抽象类可以执行的所有操作,如果它是虚拟的,则可以覆盖它的实现。或者,它实际上可能需要来提供某种实现;抽象基础知道它需要能够做某事,但不知道究竟是什么或如何。
在上面的例子中,根本不存在自行车的速度是没有意义的 - 但我们知道任何真正的自行车都会有一辆 - 所以任何真正的自行车都需要提供它