如何实现派生类并从按钮调用它

本文关键字:按钮 调用 派生 何实现 实现 | 更新日期: 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)。这个方法需要在任何抽象类中实现——如果你错过了这个,编译器会抱怨你,所以很容易不错过

从抽象类派生的任何东西都可以访问抽象类所能做的一切,如果它是虚拟的,可以覆盖它的实现。或者,它可能实际上需要提供某种实现;抽象基类知道它需要能够做某事,但不确切地知道做什么或如何做。

在上面的例子中,一辆不存在的自行车会有一个最高速度是没有意义的——但是我们知道任何真正的自行车通常都会有一个——所以任何真正的自行车都需要提供它。