账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    C# 子类只覆盖父类的属性,调用方法时为什么获取不到覆盖的值?
    44
    0

    代码如下,主要看最后的

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CSharpClassTest
    {
        /*
         * 原始:https://blog.csdn.net/tc_1337/article/details/80957140#commentsedit
         */
    
        class A
        {
            public static string StaticStr = "A 的静态字段";
            public string NonStaticStr = "A 的非静态字段";
    
            public string NoStaticProperty { get; set; } = "A 的非静态属性";
    
            public static void StaticMethod()
            {
                Console.WriteLine("A 的静态方法");
            }
    
            public void NonStaticMethod()
            {
                Console.WriteLine($"A 的非静态方法输出:A 的非静态字段 | A 的非静态属性输出:{NonStaticStr} | {NoStaticProperty}");
            }
    
        }
    
        class B : A
        {
    
            public static string StaticStr = "B 的静态字段";
            public string NonStaticStr = "B 的非静态字段";
    
            public static void StaticMethod()
            {
                Console.WriteLine("B 的静态方法");
            }
    
            public void NonStaticMethod()
            {
                Console.WriteLine($"B 的非静态方法输出:{NonStaticStr}");
            }
    
        }
    
        class C : A
        {
    
        }
    
        class D : A
        {
            public string NonStaticStr = "D 的非静态字段";
        }
    
        class E : A
        {
            public string NoStaticProperty { get; set; } = "E 的非静态属性";
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                C c = new C();
                Console.WriteLine("使用 单纯继承A的C类对象 进行调用:");
                Console.WriteLine(c.NonStaticStr);      // A 的非静态字段
                c.NonStaticMethod();                    // A 的非静态方法输出:A 的非静态字段 | A 的非静态属性
                Console.WriteLine("-------------------------------\r\n");
    
                A c1 = new C();
                Console.WriteLine("使用 以C类实例化的A类对象 进行调用:");
                Console.WriteLine(c1.NonStaticStr);     // A 的非静态字段
                c1.NonStaticMethod();                   // A 的非静态方法输出:A 的非静态字段 | A 的非静态属性
                Console.WriteLine("-------------------------------\r\n");
    
                B b = new B();
                Console.WriteLine("使用 覆盖了A类成员的B类对象 进行调用:");
                Console.WriteLine(b.NonStaticStr);      // B 的非静态字段
                b.NonStaticMethod();                    // B 的非静态方法输出:B 的非静态字段
                Console.WriteLine("-------------------------------\r\n");
    
                A b1 = new B();
                Console.WriteLine("使用 以B类实例化的A类对象 进行调用:");
                Console.WriteLine(b1.NonStaticStr);     // A 的非静态字段
                b1.NonStaticMethod();                   // A 的非静态方法输出:A 的非静态字段 | A 的非静态属性
                Console.WriteLine("-------------------------------\r\n");
    
                D d = new D();
                Console.WriteLine("使用 仅覆盖了A类非静态字段的D类对象 进行调用:");
                Console.WriteLine(d.NonStaticStr);     // D 的非静态字段
                d.NonStaticMethod();                   // A 的非静态方法输出:A 的非静态字段 | A 的非静态属性
                Console.WriteLine("-------------------------------\r\n");
    
                E e = new E();
                Console.WriteLine("使用 仅覆盖了A类非静态属性的E类对象 进行调用:");
                Console.WriteLine(e.NoStaticProperty); // E 的非静态属性
                e.NonStaticMethod();                   // A 的非静态方法输出:A 的非静态字段 | A 的非静态属性
                Console.WriteLine("-------------------------------\r\n");
            }
        }
    }
    

    @Woody 的启发:

        class AA
        {
            public virtual string NoStaticProperty { get; set; } = "AA 的非静态虚属性";
    
            public void NonStaticMethod()
            {
                Console.WriteLine($"AA 的非静态方法输出: 非静态属性:{NoStaticProperty}");
            }
    
        }
    
        class BB : AA
        {
            public override string NoStaticProperty { get; set; } = "BB 的非静态属性";
        }
    
        class CC : AA
        {
            public new string NoStaticProperty { get; set; } = "CC 的非静态属性";
        }
        
        //...
        
    BB bb = new BB();
    Console.WriteLine("使用 仅覆盖了AA类非静态虚属性的BB类对象 进行调用:");
    Console.WriteLine(bb.NoStaticProperty); // BB 的非静态属性
    bb.NonStaticMethod();                   // AA 的非静态方法输出: 非静态属性:BB 的非静态属性
    Console.WriteLine("-------------------------------\r\n");
    
    CC cc = new CC();
    Console.WriteLine("使用 new了AA类非静态虚属性的CC类对象 进行调用:");
    Console.WriteLine(cc.NoStaticProperty); // CC 的非静态属性
    cc.NonStaticMethod();                   // AA 的非静态方法输出: 非静态属性:AA 的非静态虚属性
    Console.WriteLine("-------------------------------\r\n");
    
    AA ab = new BB();
    Console.WriteLine("使用 以BB类实例化的AA类对象 进行调用:");
    Console.WriteLine(ab.NoStaticProperty); // BB 的非静态属性
    ab.NonStaticMethod();                   // AA 的非静态方法输出: 非静态属性:BB 的非静态属性
    Console.WriteLine("-------------------------------\r\n");
    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版

    回答动态

    师傅被妖怪抓走了:发布了悬赏问题火爆全网的“元宇宙”到底是什么?预计能赚取 1积分收益
    酒后略带风情:发布了悬赏问题Android内存中Graphics与Code占用过高预计能赚取 10积分收益
    扛起拖把扫天下:发布了悬赏问题typescript如何导出接口配置?求解,谢谢!预计能赚取 10积分收益
    发布了悬赏问题Vue 如何改变返回页面的路径?如让B页面只能返回到A页面.预计能赚取 11积分收益
    发布了悬赏问题vue H5移动端;底部bottom固定定位,安卓弹起键盘导致页面变形如何解决?预计能赚取 10积分收益
    发布了悬赏问题请问为什么tomcat8.5 GET请求中文正常,POST请求还需要设置UTF-8.预计能赚取 10积分收益
    发布了悬赏问题vue2.5+ts创建以及引入jq的方法预计能赚取 11积分收益
    情场浪女:发布了悬赏问题import ggplot时报错module 'pandas' has no attribute 'tslib'预计能赚取 10积分收益
    见心书画许老师18753375161:发布了悬赏问题echarts3 legend禁止点击事件,允许悬浮事件预计能赚取 11积分收益
    aa_92cb0bd09f:发布了悬赏问题codewar上的一个问题预计能赚取 11积分收益