Code Bye

求好心大侠帮忙分析一下这段程序 本人初学C#

 

// abstract_keyword.cs
// Abstract Classes
using System;
abstract class BaseClass   // Abstract class
{
    protected int _x = 100;
    protected int _y = 150;
    public abstract void AbstractMethod();   // Abstract method
    public abstract int X    { get; }
    public abstract int Y    { get; }
}

class DerivedClass : BaseClass
{
    public override void AbstractMethod()
    {
        _x++;
        _y++;
    }

    public override int X   // overriding property
    {
        get
        {
            return _x + 10;
        }
    }

    public override int Y   // overriding property
    {
        get
        {
            return _y + 10;
        }
    }

    static void Main()
    {
        DerivedClass o = new DerivedClass();
        o.AbstractMethod();
        Console.WriteLine(“x = {0}, y = {1}”, o.X, o.Y);
    }
}

主函数只访问了派生类的 public override void AbstractMethod()函数为什么结果是X=111,Y=161。本人初学C#,求详细解答

请楼主移驾C#论坛:http://bbs.csdn.net/forums/CSharp
o.X = _x++ +10, 另一个同理
这里是C/C++呢
1、override关键字,是派生类重写基类成员
2、那么在派生类调用_x++,是调用的派生类重写的属性X(进行+10运算,得到110),然后AbstractMethod进行自增1,得到结果111。
可是你最后结果是在调用x与y的属性方法~~必然会产生结果(_x++)+10这样的效果即111的结果出现。
Y也是一样的原理。
5楼大哥,Hello-Jimmy 你好   程序的运算顺序是什么呢?(上来先运算哪句然后运算哪句。。。。)程序一开始不是先运算主程序(main函数)吗?
5分
第一次通过方法_x++时,x值还没有自增,
第二次 retrun _x+10,此时_x已经自增+1了。
5分
DerivedClass o = new DerivedClass(); //_x = 100 _y=150
o.AbstractMethod(); //_x=101 _y=151 (因为有操作 _x++ _y++)
Console.WriteLine(“x = {0}, y = {1}”, o.X, o.Y); //o.X=111  o.Y=161 (因为有操作 _x+10 _y+10)
引用 7 楼 GTR995500 的回复:

5楼大哥,Hello-Jimmy 你好   程序的运算顺序是什么呢?(上来先运算哪句然后运算哪句。。。。)程序一开始不是先运算主程序(main函数)吗?


提示文本非法,靠

//F5单步调试,main方法第一行打断点
static void Main()
     {
         DerivedClass o = new DerivedClass();
         o.AbstractMethod();//进入方法体,先调用X属性
         Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
     }
引用 11 楼 lovelj2012 的回复:
//F5单步调试,main方法第一行打断点
static void Main()
     {
         DerivedClass o = new DerivedClass();
         o.AbstractMethod();//进入方法体,先调用X属性
         Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
     }

 单步到这里就运算结束了,没看到怎么加的10.即:

撸主,get内以及AbstractMethod你都没打断点,直接到Console.WriteLine的,哪里是单步调试呢?
引用 13 楼 lovelj2012 的回复:

撸主,get内以及AbstractMethod你都没打断点,直接到Console.WriteLine的,哪里是单步调试呢?

  刚问了下百度怎么打断点,呵呵,但这两句不知道是干什么的    大哥指教啊

引用 14 楼 GTR995500 的回复:
Quote: 引用 13 楼 lovelj2012 的回复:

撸主,get内以及AbstractMethod你都没打断点,直接到Console.WriteLine的,哪里是单步调试呢?

  刚问了下百度怎么打断点,呵呵,但这两句不知道是干什么的    大哥指教啊

靠,你断点没打对地方!
不是给你讲了么,派生类重写(override)基类成员,派生类调用的是自己重写的 成员,你的断点应该打在派生类。

基础知识你自己看msdn吧!

引用 15 楼 lovelj2012 的回复:
Quote: 引用 14 楼 GTR995500 的回复:
Quote: 引用 13 楼 lovelj2012 的回复:

撸主,get内以及AbstractMethod你都没打断点,直接到Console.WriteLine的,哪里是单步调试呢?

  刚问了下百度怎么打断点,呵呵,但这两句不知道是干什么的    大哥指教啊

靠,你断点没打对地方!
不是给你讲了么,派生类重写(override)基类成员,派生类调用的是自己重写的 成员,你的断点应该打在派生类。

基础知识你自己看msdn吧!

  大哥息怒,我是初学者。在哪断是对的?
我都断了也没遍历到那两句。

25分
to撸主,
首先,纠正一下,AbstractMethod方法,哥看成X++了,你的是_x++

代码执行顺序
1、调用基类_x的声明,然后_x自增1,变成101
2、通过派生类调用X,代码进入X属性的get代码段

断点这么打

public override void AbstractMethod()
        {
            _x++;//此次打断点,执行完,监视下_x的值会变成101
            _y++;
        }
public override int X   // overriding property
        {
            get
            {
                return _x + 10;//此次打断点,执行完会看到_x的值变成101
            }
        }
纠正,上面的帖子,
return _x + 10;

处注释写错,改成

//此次打断点,执行完会看到_x的值变成111
5分
这要断点调试干什么?都是你自己指定的
public override int X   // overriding property
    {
        get
        {
            return _x + 10; //表示当读取 X 属性时返回 _x + 10
        }
    }

初学就该从基本的规则学起

引用 19 楼 xuzuning 的回复:

这要断点调试干什么?都是你自己指定的
public override int X   // overriding property
    {
        get
        {
            return _x + 10; //表示当读取 X 属性时返回 _x + 10
        }
    }

初学就该从基本的规则学起

撸主搞不明白代码执行顺序,让他打断点走一遍。

明白了,谢谢大家的帮忙。
x y 都是加10再加1 ,有什么问题吗?
去看看继承的东西吧

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求好心大侠帮忙分析一下这段程序 本人初学C#