首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#调用重写的子类方法,而不知道它是一个子类实例

在C#中,当您想要调用一个子类方法,而不知道它是一个子类实例时,可以使用多态性。多态性允许您使用基类类型的引用来调用派生类中的方法。以下是一个示例:

代码语言:csharp
复制
using System;

public class BaseClass
{
    public virtual void Method()
    {
        Console.WriteLine("Base class method");
    }
}

public class DerivedClass : BaseClass
{
    public override void Method()
    {
        Console.WriteLine("Derived class method");
    }
}

public class Program
{
    public static void Main()
    {
        BaseClass baseClass = new DerivedClass();
        baseClass.Method();
    }
}

在这个示例中,我们创建了一个基类BaseClass和一个派生类DerivedClassDerivedClass重写了Method()方法。然后,在Main()方法中,我们创建了一个DerivedClass实例,并将其引用存储在BaseClass类型的变量中。当我们调用Method()方法时,将调用DerivedClass中的重写方法,因为这是实际的实例。

在您的问题中,您提到了C#调用重写的子类方法,而不知道它是一个子类实例。这是一个典型的多态性用例,可以让您在不了解实际实例类型的情况下调用子类方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

创建子类对象时,父类构造函数中调用子类重写方法为什么调用子类方法

static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象时候父类会调用子类方法...但是:创建B对象父类会调用父类方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存中。...如果,子类重写了父类方法子类方法引用会指向子类方法,否则子类方法引用会指向父类方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译时候,父类构造方法调用方法参数已经强制转换为符合父类方法参数了。 上边代码在编译前已经转换为下面这个样子了。

6.2K10

关于使用MethodHandle在子类调用祖父类重写方法探究

关于使用MethodHandle在子类调用祖父类重写方法探究 注:这个例子原本出现在周志明先生《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...在普通方法调用中,这个this参数是虚拟机自动处理,表示是当前实例对象,我们在方法中可以直接使用。..."); } 那么invoke方法就需要两个参数,一个隐式"this",一个String。...这个参数中指定方法接收者类型,bindTo指定接收者类型必须要是这个类或子类,不然会出现ClassCastException异常。...我们也可以使用findVirtual找到该方法,不过就需要一个GrandFather实例对象(当然也就不用使用反射了): static class Son extends Father { void

9.5K30
  • C# 学习笔记(4)—— C#面向对象编程

    C#继承 C# 与 C++ 不同,C# 仅支持派生于一个基类, C++ 则支持多重继承。...子类初始化顺序如下: 初始化类实例字段 调用基类构造函数,如果没有指明基类,则调用 System.Object 构造函数 调用子类构造函数 namespace ConsoleApp1 {...,然后在子类中使用override关键字对基类方法进行重写。...这样,每个基类在调用相同方法时将表现出不同行为,这段代码正是 C# 中多态实现 如果子类还行继续访问基类定义方法,则可以使用base关键字完成调用 抽象类 上面的代码存在一个问题:我们可以通过new...操作符创建 Animal 基类实例,可 Animal 基类作用是为所有子类提供公共成员,它是一个抽象概念,在实际系统中我们希望能避免创建该类实例,怎么办?

    20630

    C# 基础知识系列- 4 面向对象

    public Person() 和public Person(string name)是构造方法,所谓构造方法就是初始化一个实例方法调用形式如下: Person p = new Person()...封装 封装简单来讲就是调用不知道调用具体实现以及内部机制,就像我们看别人只能看到外表却看不到器官运作(当然除非你是医生)。...具体介绍是: virtual 关键字声明函数为虚函数,意思就是子类可能会重写方法 override 用在子类,用来声明该方法重写父类方法 new 跟实例化对象new不同,这个放在方法意思是该方法会隐藏父类方法实现...Object 类 常用方法 object 作为基类定义了四个基本方法,这四个方法是所有子类都有的方法,也是一个核心方法: Equals(object obj) 这是一个很重要方法它是 C#中判断两个对象是否相等依据...扩展方法 C#一个很重要机制就是扩展方法,扩展方法表现出跟类自有的方法调用结果一致。

    50430

    c#多态学习总结

    多态就是同一个接口,使用不同实例执行不同操作 1、静态多态性 在编译时,函数和对象连接机制被称为早期绑定,也被称为静态绑定。C#提供了两种技术来实现静态多态性。...c#中,也有类似的特性,并且也更加多特性,有关抽象类一些规则: a、您不能创建一个抽象类实例。 b、您不能在一个抽象类外部声明一个抽象方法。...* * 这里强调一次: * 在子类中用 override 重写父类中用 virtual 申明方法时, * 实例化父类调用方法,执行时调用子类重写方法; 如果在子类中用 new...覆盖父类中用 virtual 申明方法时, * 实例化父类调用方法,执行时调用是父类中方法 * * override是重写,即将基类方法在派生类里直接抹去重新写,故而调用方法就是子类方法...1.virtual修饰方法必须有实现(哪怕是仅仅添加一对大括号),abstract修饰方法一定不能实现。 2.virtual可以被子类重写abstract必须被子类重写

    82320

    C#类、方法和属性

    类: 类(class)是面向对象中最基本单元,它是一种抽象,对现实世界中事物抽象,在C#中使用class关键字声明一个类: class MyClass{} 类既然是一个抽象,我们使用时候就要对其进行实例化...每个类都有一个构造方法(constructor),构造方法名字必须跟类名一致(我们实例时候就是调用这个方法),如果不显式声明类构造方法,系统就会默认生成一个无参构造方法。...需要注意是,在执行类构造方法之前,会先执行其父类无参构造方法,或者,我们指定父类有参构造,因为子类继承了父类,在实例子类时候,必定要将继承自父类成员也在内存中创建出来,注意,这并非是实例化父类...包含了抽象方法类必须要定义成抽象类,抽象类只能被继承,不能被实例,它就像一个骨架一样,具体填充需要交给它子类。...关于方法,还有一个知识点,叫方法重写,它跟继承有关,如果想重写父类方法,那么父类方法,就要设置为virtual也就是虚方法子类重写,需要使用关键字override。

    2K30

    .NET基础拾遗(2)面向对象实现和异常处理基础

    如上图所示,砖石继承问题根源在于最终子类从不同父类中继承到了在它看来完全不同两个成员,事实上,这两个成员又来自同一个基类。...(1)重写和隐藏   重写(Override)是指子类用Override关键字重新实现定义在基类中方法,并且在实际运行时根据对象类型来调用相应方法。   ...我们可以看到:当通过基类引用去调用对象内方法时,重写仍然能够找到定义在对象真正类型中GetString方法隐藏则只调用了基类中GetString方法。   ...1.3 为什么不能在构造方法调用方法?   在C#程序中,构造方法调用方法一个需要避免禁忌,这样做到底会导致什么异常?...其根本方法就在于:永远不要在非叶子类构造方法调用方法。 1.4 C#如何声明一个类不能被继承?

    61210

    C# .NET面试系列二:面向对象

    封装提供了对对象抽象,使得对象可以被看作是一个独立实体,不需要了解其内部实现。继承(Inheritance):继承是一种机制,允许一个类(子类或派生类)继承另一个类(父类或基类)属性和方法。...执行顺序:父类静态构造函数,子类静态构造函数,父类静态字段初始化,子类静态字段初始化,父类实例构造函数,父类非静态字段初始化,子类实例构造函数,子类非静态字段初始化,方法调用父类静态构造函数...实例构造函数用于初始化实例成员,每次创建实例时都会执行。子类非静态字段初始化:执行子类非静态字段初始化。非静态字段按照声明顺序初始化。方法调用:最后,可以调用类中方法。...重写涉及到基类和派生类之间关系,基类中方法在派生类中被重新实现。重载是编译时多态性,根据调用时提供参数类型来确定调用哪个方法重写是运行时多态性,根据对象实际类型来确定调用哪个方法。...在C#中,静态方法不能直接访问非静态变量。这是因为静态方法是与类关联,而非静态变量是与类实例关联。在静态方法中,没有隐式 this 实例,因为静态方法是属于整个类不是类实例

    22910

    C#“智能枚举”:如何在枚举中增加行为

    这意味着您可以在枚举类型上调用方法和属性,就像在类实例调用它们一样。 智能枚举跟设计模式意义一样,可以帮助您避免重复代码,并提高代码可读性和可维护性。...它还重写了 Equals 和 GetHashCode 方法,以便可以比较两个枚举值是否相等。...每个子类重写了父类 CreditCard 中 Discount 属性,以表示不同信用卡折扣率。GoldCreditCard 有最高折扣率,NoneCreditCard 没有任何折扣。...在 CreditCard 类中,Gold、Silver、Standard 和 None 是四个静态实例,表示四种不同信用卡类型。每个实例都是通过相应子类创建,并传入相应值和名称。...每个子类都包含一个抽象 Discount 属性,表示该类型信用卡折扣率。 CreditCard 类中静态实例则表示四种不同信用卡类型。

    30920

    那些年~~~我们C#笔试内测题目

    a) 虚方法必须有方法体,可以被子类重写 b) 抽象方法不允许有方法体,且必须被子类重写 c) 抽象方法必须在抽象类中,方法可以在所有类中 密封类和静态类中不能书写 d) 在子类重写抽象方法或虚方法...02.父类变量只能调用到父类方法不能调用子类方法,即使该父类变量存储是子类。 程序员;编码能力   打字能力。...15) 在C#中,( C)关键字用于子类构造函数明确指明调用父类构造函数。...a) new  创建对象时使用 b) this   代表当前类实例 c) base  显示调用父类构造方法和父类属性和常规方法 d) is 16) C#多态不能通过(D )实现。...a) 在单例模式中,允许通过new 构造实例 b) 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例 c) 在C# 中,static 是实现单例模式重要关键字 d) 单例模式可以确保所有对象都访问唯一实例

    2.4K111

    C#“智能枚举”:在枚举中增加行为?

    这意味着您可以在枚举类型上调用方法和属性,就像在类实例调用它们一样。 智能枚举跟设计模式意义一样,可以帮助您避免重复代码,并提高代码可读性和可维护性。...它还重写了 Equals 和 GetHashCode 方法,以便可以比较两个枚举值是否相等。...每个子类重写了父类 CreditCard 中 Discount 属性,以表示不同信用卡折扣率。GoldCreditCard 有最高折扣率,NoneCreditCard 没有任何折扣。...在 CreditCard 类中,Gold、Silver、Standard 和 None 是四个静态实例,表示四种不同信用卡类型。每个实例都是通过相应子类创建,并传入相应值和名称。...每个子类都包含一个抽象 Discount 属性,表示该类型信用卡折扣率。 CreditCard 类中静态实例则表示四种不同信用卡类型。

    38620

    使用 C# (.NET Core) 实现模板方法模式 (Template Method Pattern)

    所以说: 模板方法定义了一个算法步骤, 并允许子类提供其中若干个步骤具体实现. 捋一遍整个流程 1. 我需要做一个茶: 2. 然后调用模板方法: 3....类图: 这个抽象类: 针对这个抽象类, 我们可以有一些扩展: 看这个hook方法, 它是一个具体方法, 但是啥也没做, 这种就叫做钩子方法. 子类可以重写方法, 也可以不重写....模板方法里面的钩子 所谓钩子, 它是一个在抽象类里面声明方法, 但是方法里面默认实现是空. 这也就给了子类"钩进"算法某个点能力, 当然子类也可以不这么做, 就看子类是否需要了....好莱坞原则和模板方法模式 模板方法里, 父类控制算法, 并在需要时候调用子类方法. 子类从来不会直接主动调用父类方法. 其他问题 好莱坞原则和依赖反转原则DIP区别?...父类里面JFramepaint()啥也没做, 就是个钩子, 我们可以在子类里面重写paint(), 上面例子效果就是: 另一个例子Applet小程序: 这5个方法全是重写钩子...

    97540

    编码最佳实践——里氏替换原则

    子类型可以重写(或部分定制)客户端所调用基类任意方法子类型:继承自基类型(T)一组类(S)中任意一个。客户端不应该,也不需要知道它们实际调用哪个具体子类型。...前置条件 前置条件(precondition)是一个能保障方法稳定无错运行先决条件。所有方法在被调用钱都要求某些前置条件为真。...,子类被允许重写父类方法实现,此时才有机会修改其中契约。...1.子类型不能加强前置条件 当子类重写包含前置条件超类方法时,绝不应该加强现有的前置条件,这样做会影响到那些已经假设超类为所有方法定义了最严格前置条件契约客户端代码。...协变 下图展示了一个非常小类层次结构,包含了基(超)类Supertype和子类Subtype。 多态是一种子类型被看做基类型实例能力。

    1.3K20

    Python3 与 C# 面向对象之~继承与多态

    1.封装(点我) 2.继承 2.1.单继承 在OOP中,当我们定义一个Class时候,可以从某个现有的Class继承 新Class称为子类被继承class称为 基类 或者 父类 Python继承格式...这时候,小明老高兴了,单回头一想 ==> 不科学啊,dog应该有其对应方法吧,C#有虚方法重写,Python怎么搞?在子类里面又怎么调用父类方法呢?...,赶紧问问旁边同样预习伟哥 不一会儿淡定发了份重写父类方法demo给老师: # 重写父类方法==>子类和父类有同名方法 class Father(object): def __init__...当子类和父类都存在相同 eat()方法时,我们说,子类 eat()覆盖了父类 eat() 在代码运行时候,总是会调用子类 eat() 这样,我们就获得了继承一个好处:多态 2.2.多继承...小碎步 继承可以把父类所有功能都直接拿过来,这样就不必重0开始写代码,子类只需要新增自己特有的方法,也可以把父类不适合方法覆盖重写 注意一个情况,如果父类里面有同名方法咋办了?

    1.4K30

    A4第四章第2节null和成员变量、局部变量不同初始化

    6、我们定义一个【类】后,就必须实例化才能使用。【实例化】就是创建一个【对象】过程。 在C#中,我们使用new运算符关键字来创建。...子类会从父类继承所有非private成员。子类还可以有子类C#一个类只能有一个父类,如果没指定父类,则System.Object为父类。...子类中定义和父类中一样方法就叫“重写(Override)或覆盖”,父类中可以被Override方法要声明为virtual 。...、调用方法还是对象方法不是变量类型实现 4、记住::【【能够调用什么方法由变量类型决定,执行谁方法由实际指向对象决定】】 DiQiuRen dqr1=new Chinese(); DiQiuRen...不能创建abstract 类实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类一个实例。不能有抽像构造函数或抽像静态方法

    54010

    Python3 与 C# 面向对象之~继承与多态

    ,单回头一想 ==> 不科学啊,dog应该有其对应方法吧,C#有虚方法重写,Python怎么搞?...对于小明提示老师很高兴,于是点名小潘来写一个子类调用父类demo(老师昨天从窗户里看见小潘有预习): In [3]: # 调用父类方法 class Father(object): def...,赶紧问问旁边同样预习伟哥 不一会儿淡定发了份重写父类方法demo给老师: In [4]: # 重写父类方法==>子类和父类有同名方法 class Father(object): def...当子类和父类都存在相同eat()方法时,我们说,子类eat()覆盖了父类eat() 在代码运行时候,总是会调用子类eat() 这样,我们就获得了继承一个好处:多态 2.2.多继承 在讲多态之前...小碎步 继承可以把父类所有功能都直接拿过来,这样就不必重0开始写代码,子类只需要新增自己特有的方法,也可以把父类不适合方法覆盖重写 注意一个情况,如果父类里面有同名方法咋办了?

    1.6K30

    JAVA面试题全集(上)

    系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电方法,但并不知道供电系统底层实现是什么,究竟通过何种方式获得了动力)。...运行时多态是面向对象最精髓东西,要实现多态需要做两件事:1). 方法重写子类继承父类并重写父类中已有的或抽象方法);2)....对象造型(用父类型引用引用子类型对象,这样同样引用调用同样方法就会根据子类对象不同表现出不同行为)。...当一个对象实例作为一个参数被传递到方法中时,参数值就是对该对象引用。对象属性可以在被调用过程中被改变,但对对象引用改变是不会影响到调用。...重载发生在一个类中,同名方法如果有不同参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类重写方法与父类被重写方法有相同返回类型,比父类被重写方法更好访问

    50710

    计算机程序思维逻辑 (15) - 初识继承和多态

    写类名是可以理解,表示对象类型,写哈希值则是不得已,因为Object类并不知道具体对象属性,不知道怎么用文本描述,但又需要区分不同对象,只能是写一个哈希值。...toString方法前面有一个 @Override,这表示toString这个方法重写父类方法重写方法返回Pointx和y坐标的值。重写后,将调用子类实现。...说明几点: Java使用extends关键字标明继承关系,一个类最多只能有一个父类。 子类不能直接访问父类私有属性和方法,比如,在Circle中,不能直接访问shape私有实例变量color。...ShapeManager并不知道每个shape具体类型,也不关心,但可以调用子类draw方法。 我们来看下使用ShapeManager一个例子: ?...子类对象可以赋值给父类引用变量,这叫多态,实际执行调用子类实现,这叫动态绑定。 但关于继承,还有很多细节,比如实例变量重名情况。

    58090

    使用C# (.NET Core) 实现模板方法模式 (Template Method Pattern)

    我需要做一个茶: 2. 然后调用模板方法: 3....类图: 这个抽象类: 针对这个抽象类, 我们可以有一些扩展: 看这个hook方法, 它是一个具体方法, 但是啥也没做, 这种就叫做钩子方法. 子类可以重写方法, 也可以不重写....模板方法里面的钩子 所谓钩子, 它是一个在抽象类里面声明方法, 但是方法里面默认实现是空. 这也就给了子类"钩进"算法某个点能力, 当然子类也可以不这么做, 就看子类是否需要了....好莱坞原则和模板方法模式 模板方法里, 父类控制算法, 并在需要时候调用子类方法. 子类从来不会直接主动调用父类方法. 其他问题 好莱坞原则和依赖反转原则DIP区别?...父类里面JFramepaint()啥也没做, 就是个钩子, 我们可以在子类里面重写paint(), 上面例子效果就是: 另一个例子Applet小程序: 这5个方法全是重写钩子...

    62320

    C#基础补充

    C#基础补充 A.对值类型分配。 虚拟内存中存在一个叫堆栈区域,我们并不知道它到底在地址空间什么地方,在一般开发过程中也没有必要知道,我们知道是值类型就分配于此。...C# 支持访问修饰符如下所示: public:所有对象都可以访问; private:对象本身在对象内部可以访问; protected:只有该类对象及其子类对象可以访问 internal:同一个程序集对象可以访问...Dispose方法,释放实例。...关于构造函数补充: 对于父类与子类来讲,子类调用构造函数时会首先调用父类构造函数再调用子类构造函数。...同样,如果是多次继承,那么后面的子类调用构造函数时会从最上面的父类构造函数开始调用一次往下,直到自己构造函数。

    15410
    领券