C#中继承和多态的研究

通常继承

在这个部分,我将构建两个类ABBA的子类。

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 表示从外部直接访问对象属性得到的值。

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

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

在这个部分,我将构建两个类ABBA的子类。 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

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

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

在这个部分,我将构建两个类ABBA的子类。 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

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


赤石俊哉
127 声望227 粉丝