c# 继承 疑惑求解答。

异常异长 2013-09-28 12:01:20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
class Program
{
public int a = 100;
public void min()
{
this.a--;
}
static void Main(string[] args)
{
test t = new test();
t.min();
Console.WriteLine(t.a);
Console.WriteLine(t.getA());
Console.Read();
}
}
class test : Program
{
int a = 8;
public void plus()
{
this.a++;
}
public int getA()
{
return base.a;
}
}
}

代码如上,我在调试时 t.min(); 中的 this.a-- this指向的是test 但是为什么this.a 却是使用的Program里的字段a 而不是test里的字段a。
...全文
135 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
异常异长 2013-09-28
  • 打赏
  • 举报
回复
引用 16 楼 caozhy 的回复:
不可以说明。 做一个实验: 在Test中加入如下代码: public override string ToString() { return "ConsoleApplication4.Program"; } 你就可以看到截然相反的效果。
嗯 不过 如果子类不重写父类的方法 好像调用不到子类的字段属性
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        private int a = 100;
        public virtual  int A
        {
            get { return a; }
            set { a = value; }
        }
        public void min()
        {
            this.a--;
        }

        static void Main(string[] args)
        {
            test t = new test();
            Program p = new Program();
           // p.min();
            t.min();
            //t.plus();
            Console.WriteLine(t.a);
            Console.WriteLine(t.getA());
            Console.Read();
        }
    }
    class test : Program
    {
         int a = 8;
          public override  int A
        {
            get { return a; }
            set { a = value; }
        }
        public void plus()
        {
            this.a++;
        }
        public int getA()
        {
            return base.A;
        }
        public override string ToString() { return "ConsoleApplication4.Program"; }
    }
}
threenewbee 2013-09-28
  • 打赏
  • 举报
回复
不可以说明。 做一个实验: 在Test中加入如下代码: public override string ToString() { return "ConsoleApplication4.Program"; } 你就可以看到截然相反的效果。
异常异长 2013-09-28
  • 打赏
  • 举报
回复
引用 14 楼 caozhy 的回复:
[quote=引用 13 楼 stubble 的回复:] [quote=引用 11 楼 caozhy 的回复:] 两个a没有任何关系。只是你人为地让他们故意重名而已。 你可以做一个实验,把其中一个改一个类型,比如改成string。程序一样运行。
[/quote] 你看到的“值”,是指调用 this.ToString() 输出的字符串。 这不能说明this.a指向的是test.a[/quote]那这个可以说明 this 指向的是 test么
threenewbee 2013-09-28
  • 打赏
  • 举报
回复
引用 13 楼 stubble 的回复:
[quote=引用 11 楼 caozhy 的回复:] 两个a没有任何关系。只是你人为地让他们故意重名而已。 你可以做一个实验,把其中一个改一个类型,比如改成string。程序一样运行。
[/quote] 你看到的“值”,是指调用 this.ToString() 输出的字符串。 这不能说明this.a指向的是test.a
异常异长 2013-09-28
  • 打赏
  • 举报
回复
引用 11 楼 caozhy 的回复:
两个a没有任何关系。只是你人为地让他们故意重名而已。

你可以做一个实验,把其中一个改一个类型,比如改成string。程序一样运行。
异常异长 2013-09-28
  • 打赏
  • 举报
回复
引用 10 楼 caozhy 的回复:
[quote=引用 9 楼 stubble 的回复:]
[quote=引用 8 楼 caozhy 的回复:]
你可以这么使用:

class A
{
protected virtual int A { get; set; }
public void Min() { A--; }
}
class B : A
{
private int a = 0;
protected override int A { get { return this.a; } set { this.a = value; } }
}

是不是 我原代码中 test的字段a 没有覆盖掉 Program中的字段 a
我的疑惑就是 this明明指向的是test 但是 test.a 却是Program的a
只要纠结在这。能麻烦帮解惑么[/quote]

什么叫this指向的是test。你在基类定义的怎么能指向派生类呢?[/quote]我调试的时候 this指向的是test。
threenewbee 2013-09-28
  • 打赏
  • 举报
回复
两个a没有任何关系。只是你人为地让他们故意重名而已。 你可以做一个实验,把其中一个改一个类型,比如改成string。程序一样运行。
threenewbee 2013-09-28
  • 打赏
  • 举报
回复
引用 9 楼 stubble 的回复:
[quote=引用 8 楼 caozhy 的回复:] 你可以这么使用: class A { protected virtual int A { get; set; } public void Min() { A--; } } class B : A { private int a = 0; protected override int A { get { return this.a; } set { this.a = value; } } }
是不是 我原代码中 test的字段a 没有覆盖掉 Program中的字段 a 我的疑惑就是 this明明指向的是test 但是 test.a 却是Program的a 只要纠结在这。能麻烦帮解惑么[/quote] 什么叫this指向的是test。你在基类定义的怎么能指向派生类呢?
异常异长 2013-09-28
  • 打赏
  • 举报
回复
引用 8 楼 caozhy 的回复:
你可以这么使用: class A { protected virtual int A { get; set; } public void Min() { A--; } } class B : A { private int a = 0; protected override int A { get { return this.a; } set { this.a = value; } } }
是不是 我原代码中 test的字段a 没有覆盖掉 Program中的字段 a 我的疑惑就是 this明明指向的是test 但是 test.a 却是Program的a 只要纠结在这。能麻烦帮解惑么
threenewbee 2013-09-28
  • 打赏
  • 举报
回复
你可以这么使用: class A { protected virtual int A { get; set; } public void Min() { A--; } } class B : A { private int a = 0; protected override int A { get { return this.a; } set { this.a = value; } } }
异常异长 2013-09-28
  • 打赏
  • 举报
回复
引用 6 楼 caozhy 的回复:
你自始至终也没有使用Test里面的a。 你使用的是base.a,也没有调用plus,也没有调用能返回this.a的方法。
那我的min方法能调用到test自己的a么?
threenewbee 2013-09-28
  • 打赏
  • 举报
回复
你自始至终也没有使用Test里面的a。 你使用的是base.a,也没有调用plus,也没有调用能返回this.a的方法。
异常异长 2013-09-28
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
Program里的字段a跟test里的字段a根本没有任何继承(或者别的什么)关系,这是首先要搞清楚的。 然后,方法min“是针对哪一个字段a”就能搞清楚了。
但是 this 指向的是 test 我的理解就是this.a 是不是该指向test的a。 始终没想明白
异常异长 2013-09-28
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
假使你说的成立,那么这意味着,“如果基类有一个同名的变量”,那么你就可以访问继承类中的同名private变量了。你觉得这样的编程语言是不是很滑稽。
但是 this 指向的是 test 我的理解就是this.a 是不是该指向test的a。 始终没想明白
异常异长 2013-09-28
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
Program里的字段a跟test里的字段a根本没有任何继承(或者别的什么)关系,这是首先要搞清楚的。 然后,方法min“是针对哪一个字段a”就能搞清楚了。
就是说 这两个a 完全是两个东西?
threenewbee 2013-09-28
  • 打赏
  • 举报
回复
假使你说的成立,那么这意味着,“如果基类有一个同名的变量”,那么你就可以访问继承类中的同名private变量了。你觉得这样的编程语言是不是很滑稽。
  • 打赏
  • 举报
回复
Program里的字段a跟test里的字段a根本没有任何继承(或者别的什么)关系,这是首先要搞清楚的。 然后,方法min“是针对哪一个字段a”就能搞清楚了。
异常异长 2013-09-28
  • 打赏
  • 举报
回复
写错了。。。可以调用到 麻烦你了
异常异长 2013-09-28
  • 打赏
  • 举报
回复
用你的方法 调用不到子类的属性

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧