如何实现派生类并从按钮调用它
本文关键字:按钮 调用 派生 何实现 实现 | 更新日期: 2023-09-27 18:12:03
我今年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();
}
假设您想要创建一个特定的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#中的访问修饰符将使这个和其他相关的事情更清楚。
抽象类只是如何制作某些东西的模板或指南。
在您的示例中,它是如何制作摩托车的指南。你实际上不能创建一个摩托车。
你不能去经销商那里要一辆摩托车。本田?川崎吗?150 cc的吗?650 cc的吗?怎么啦?
你的导游告诉你:
- 应该可以由某人(
*public* void StartEngine()
)启动 - 内部,应该能够添加一些汽油-对不起,英国- (
*protected* void AddPetrol(int litres)
) - 它应该能够被某人(
*public* virtual int Drive(int miles, int speed)
)驱动 - 它有一个最高速度,有人可以读取(
*public* abstract double GetTopSpeed()
)
由此,我们可以看到任何人都可以启动它,驾驶它,并达到最高速度。
我们还可以看到自行车本身可以给自己添加一些汽油(毕竟这是一个内部内燃机)。
你决定买一辆本田。为什么?因为这是我第一个想到的。所以你要那边的那个。销售人员告诉你,这是一个很好的入门产品,没有多余的装饰,没有额外的东西,它就是好用。这是
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);
}
就这样,你开着你的本田基本型试驾,以每小时30英里的速度行驶了3英里。
我将在这里随意地假设Drive返回实际行驶的时间,因为我认为时间是当你给定某物的速度和距离时得到的。
显然你计划以每小时30英里的速度出去3英里,而你显然开了…1. 因为那是它说你做的…
public virtual int Drive(int miles, int speed) { return 1; }
driven
== 1,因为基类总是返回1 !我怀疑你能在1分30秒内跑完3英里。不重要。
我猜因为没有什么可以调用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分? 0秒?
它有办法填满油箱(坦率地说,这个模型实际上有一个油箱)。
所以,这是一些中等基础的东西。
abstract class
本身只是描述如何做事情。它可能包含也可能不包含任何实际功能;
- 它确实指定了
Drive
方法,并实现了它-尽管是以基本的方式 - 它指定了一个
GetTopSpeed
方法,但是没有实现它(abstract
)。这个方法需要在任何抽象类中实现——如果你错过了这个,编译器会抱怨你,所以很容易不错过
从抽象类派生的任何东西都可以访问抽象类所能做的一切,如果它是虚拟的,可以覆盖它的实现。或者,它可能实际上需要提供某种实现;抽象基类知道它需要能够做某事,但不确切地知道做什么或如何做。
在上面的例子中,一辆不存在的自行车会有一个最高速度是没有意义的——但是我们知道任何真正的自行车通常都会有一个——所以任何真正的自行车都需要提供它。