如何实现派生类并从Button调用它?

时间:2016-10-08 05:44:47

标签: c#

我今年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(); 
}

2 个答案:

答案 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)。这个方法需要在抽象类中生成的任何东西中实现 - 如果你错过了,编译器会向你抱怨,所以它很容易不会错过

从抽象类派生的任何内容都可以访问抽象类可以执行的所有操作,如果它是虚拟的,则可以覆盖它的实现。或者,它实际上可能需要来提供某种实现;抽象基础知道它需要能够做某事,但不知道究竟是什么或如何。

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