IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    C#中继承和多态的研究

    赤石俊哉发表于 2017-03-05 11:48:06
    love 0

    C#中继承和多态的研究

    通常继承

    在这个部分,我将构建两个类A和B,B是A的子类。

    namespace CSharpPolymorphism {
        class A {
            public string value = "A";
            public string Say() { return "I'm A, My Value: " + value; }
        }
        class B : A {
            public string value = "B";
            public string Say() { return "I'm B, My Value: " + value; }
        }
        class Program {
    
            static void Main(string[] args) {
                A Aa = new A();
                B Bb = new B();
                A Ab = new B();
    
                Console.WriteLine(Aa.Say() + ", Got Value: " + Aa.value);
                Console.WriteLine(Bb.Say() + ", Got Value: " + Bb.value);
                Console.WriteLine(Ab.Say() + ", Got Value: " + Ab.value);
    
                // Pause
                Console.ReadLine();
            }
        }
    }

    运行结果为:

    // I'm A, My Value: A, Got Value: A
    // I'm B, My Value: B, Got Value: B
    // I'm A, My Value: A, Got Value: A
    • 结果说明: I'm N 表示调用了N的方法, My Value: N 表示方法内部获取到的值, Got Value: N 表示从外部直接访问对象属性得到的值。

    由此可见,通常继承中,若使用子类来实例化父类对象,不论从类的内部还是外部访问这个对象,这个对象都会使用父类的属性和方法。

    父类定义虚方法,子类新建方法

    在这个部分,我将构建两个类A和B,B是A的子类。 A中的方法定义为virtual虚方法,B中方法定义为new新建方法。

    namespace CSharpPolymorphism {
        class A {
            public string value = "A";
            public virtual string Say() { return "I'm A, My Value: " + value; }
        }
        class B : A {
            public string value = "B";
            public new string Say() { return "I'm B, My Value: " + value; }
        }
        class Program {
    
            static void Main(string[] args) {
                A Aa = new A();
                B Bb = new B();
                A Ab = new B();
    
                Console.WriteLine(Aa.Say() + ", Got Value: " + Aa.value);
                Console.WriteLine(Bb.Say() + ", Got Value: " + Bb.value);
                Console.WriteLine(Ab.Say() + ", Got Value: " + Ab.value);
    
                // Pause
                Console.ReadLine();
            }
        }
    }

    运行结果为:

    // I'm A, My Value: A, Got Value: A
    // I'm B, My Value: B, Got Value: B
    // I'm A, My Value: A, Got Value: A

    与前面的例子结果一样,当子类新建父类的虚方法时,若使用子类来实例化父类对象,不论从类的内部还是外部访问这个对象,这个对象都会使用父类的属性和方法。

    父类定义虚方法,子类覆盖方法

    在这个部分,我将构建两个类A和B,B是A的子类。 A中的方法定义为virtual虚方法,B中方法定义为override覆盖方法。

    namespace CSharpPolymorphism {
        class A {
            public string value = "A";
            public virtual string Say() { return "I'm A, My Value: " + value; }
        }
        class B : A {
            public string value = "B";
            public override string Say() { return "I'm B, My Value: " + value; }
        }
        class Program {
    
            static void Main(string[] args) {
                A Aa = new A();
                B Bb = new B();
                A Ab = new B();
    
                Console.WriteLine(Aa.Say() + ", Got Value: " + Aa.value);
                Console.WriteLine(Bb.Say() + ", Got Value: " + Bb.value);
                Console.WriteLine(Ab.Say() + ", Got Value: " + Ab.value);
    
                // Pause
                Console.ReadLine();
            }
        }
    }

    运行结果为:

    // I'm A, My Value: A, Got Value: A
    // I'm B, My Value: B, Got Value: B
    // I'm B, My Value: B, Got Value: A

    在这个例子中,若使用子类来实例化父类对象,会调用子类的方法,而且在方法中获取的属性值是子类的,但是从外部直接访问这个对象的属性时,会使用父类对象的属性值。



沪ICP备19023445号-2号
友情链接