C# 继承中的使用new的陷阱,和abstract /virtual 的不同

假设有下面的设计:

cs 复制代码
 public class Person
 {
     public string Name { get; set; }
     public int Age { get; set; }
     public  int Height { get;}
 }

 public class Chinese: Person
 {
     public new int Height { get => 100; }
 }

基类中Height属性设计为只读,派生类中设计为可读可写,并且使用new进行覆盖;

有下方代码:

cs 复制代码
  Person me = new Chinese();
  var height = me.Height;

此时me.Height返回0;

因为声明me的时候使用的是Person类型,而Person里面Height属性的Get方法是实现的,访问的自然是Person里面Height属性,Height属性为int类型,所以初始值为0;

类似的,这个结论对于方法也适用,加入把实体像下面这样设计:

cs 复制代码
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public  int Height { get;}
    public int GetHeight()
    {
        return 0;
    }
}

public class Chinese: Person
{
    public new int Height { get => 100; }

    public new int GetHeight()
    {
        return 100;
    }
}

然后调用GetHeight方法:

cs 复制代码
 Person me = new Chinese();
 var height = me.GetHeight();

返回的height依旧是0;

想实现me.Height访问的是Chinese里面的属性,可以把实体像下面这样设计:

cs 复制代码
 public abstract class Person
 {
     public string Name { get; set; }
     public int Age { get; set; }
     public abstract int Height { get;}
 }

 public class Chinese: Person
 {
     public override int Height { get => 100; }
 }

或者:

cs 复制代码
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public virtual int Height { get;}
   
}

public class Chinese: Person
{
    public override int Height { get => 100; }
  
}

以上两种情况返回值就会是100;

由以上三种情况,针对new abstract virtual三种实现多态的关键字,在访问成员时有以下结论:

//普通方法的调用(使用new时, 调用左边类型的方法;编译时确定

//虚方法的调用,调用右边类型的方法(没有override 还是左边);运行时确定;

//抽象方法的调用,调用右边类型的方法;运行时确定;

相关推荐
星栈独行1 小时前
翻完 Pi 源码:它和 Codex、Claude Code 有何不同
开发语言·javascript·人工智能·程序人生
qq_448011161 小时前
C语言中的变量和函数的定义与声明
android·c语言·开发语言
孫治AllenSun3 小时前
【DataX】生产环境搭建DataX集群案例
java·开发语言·jvm
c238564 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
moonsims5 小时前
星闪在跨域无人化系统作用
开发语言·php
Iruoyaoxh5 小时前
栈和队列~
java·开发语言
Hrain-AI5 小时前
2026 企业 AI 编程智能体实战:Codex 与 Claude Code
开发语言·人工智能·kotlin
wdfk_prog6 小时前
嵌入式面试真题第 13 题:单硬件 Timer 下的高精度多路软件定时器架构设计
c语言·开发语言·面试·职场和发展·嵌入式
oort1236 小时前
吃上了自家的细糠,还挺丝滑,用起来手感还行,OortCloud发布新版AI编程平台,下载 OortCodex,Token多,免费薅
大数据·开发语言·人工智能·ai编程
slandarer6 小时前
MATLAB | 泰勒图绘制,支持各种角度范围
开发语言·数学建模·matlab·nature·顶刊·泰勒图