当前位置:编程学习 > C#/ASP.NET >>

问一个想不明白的问题,大神们请给个解答,万分感谢.

代码如下: 红色的注释有问题,能给解答么?


   private void button1_Click(object sender, EventArgs e)
        {

            Test t = new Test();

            t.PID = "SSSS";

            ITest i = t;

            i.Pro.ID = "AAAAA";//为什么这里的"AAAAA"没有赋值,跑哪里去了?


            MessageBox.Show(i.Pro.ID);
        }    

    public class Property 
    {
        public string ID { get; set; }

        public string Name { get; set; }
    }

    public interface ITest 
    {
        Property Pro { get; set; }
    }

    public class Test : ITest
    {

        public string PID { get; set; }
        public string PName { get; set; }


        #region ITest 成员

        Property p = new Property();

        Property ITest.Pro
        {
            get
            {
                p.ID = this.PID;
                p.Name = this.PName;

                return p;
            }
            set
            {
                p = value;
                this.PID = p.ID;
                this.PName = p.Name;
            }
        }

        #endregion
    } --------------------编程问答-------------------- 这俩ID没一毛钱关系啊 --------------------编程问答-------------------- 貌似有点乱,再看看 --------------------编程问答-------------------- 不知道你的具体问题是什么情况。 --------------------编程问答-------------------- 原因出在Get属性中

        public Property Pro
        {
            get
            {
                p.ID = this.PID;
                p.Name = this.PName;

                return p;
            }
            set
            {
                p = value;
                this.PID = p.ID;
                this.PName = p.Name;
            }
        }
--------------------编程问答-------------------- 虽然你赋值了。但是在get的时候,你又把p.ID的值给改了。

可能你接触编程(不仅仅是C#)不长,应该对这些基本概念有一定的了解(而不是理解),所以才会写出这样的代码。呵呵买本C#高级编程之类的书籍好好研究一下吧。别迷失在繁杂的应用中 --------------------编程问答-------------------- i 的pro是在哪里赋值的呢?如果你说test创建后自动称生成了,起码这句话
Property p = new Property();应该放在构造函数里啊
逻辑混乱,帮你改了下
 private void button2_Click(object sender, EventArgs e)
        {
            Test t = new Test();
            t.PID = "SSSS";
            ITest i = t;
            i.Pro.ID = "AAAAA";
            MessageBox.Show(i.Pro.ID);
        }

        public class Property
        {
            public string ID { get; set; }
            public string Name { get; set; }
        }

        public interface ITest
        {
            Property Pro { get; set; }
        }

        public class Test : ITest
        {
            Property p;
            public string PID { get; set; }
            public string PName { get; set; }

            public  Test()
            {
                p = new Property();
            }

            #region ITest 成员

            Property ITest.Pro
            {
                get
                {
                    p.ID = this.PID;
                    p.Name = this.PName;
                    return p;
                }
                set
                {
                    p = value;
                    this.PID = p.ID;
                    this.PName = p.Name;
                }
            }

            #endregion
        }
--------------------编程问答-------------------- 4L的回答是正解
关键是这里t.PID = "SSSS";
--------------------编程问答-------------------- 呵呵,看到楼主的帖子,想起自己当年开始学编程的日子了
楼主加油 --------------------编程问答-------------------- 可能让大家迷惑了.我写C#也好几年了.只不过最近才经常用接口显式实现.并且对我们程序的作用很大.

目的是A类显示继承一个接口I ,B类正常实现接口I ,希望在A类得实例中看不到I接口的内容,而当将A转换成I接口类型时候只看到接口I的属性.这样就达到了A类和B类之间的关系就是I,所以可以利用反射属性的方法,将A类和B类同时实现I接口的属性进行相互赋值.方法提供参数如果是B类型,就可以用I接口来代替,而实际传递的时候,用A类得实例传递即可.这样目的是分割A类和B类的关系,也就是说,A可以不认识B,但是一样可以进行属性传递.降低程序的耦合性.

在这个过程中,发现如果I中接口定义的属性如果类型大于B中对应属性的类型或者跟对应的属性类型不一致,就会出现例子中的问题.
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,