Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 超类和子类对象是否共享公共方法?_C#_Oop - Fatal编程技术网

C# 超类和子类对象是否共享公共方法?

C# 超类和子类对象是否共享公共方法?,c#,oop,C#,Oop,如果我不将一个方法标记为virtual,它是否可用于派生类 如果使用objecta,我将更改基类的方法。然后对象b访问基类的相同方法m1()(可用于派生类) 它会按对象a打印这些更改的值吗 他们会分享共同的方法吗 class A { public int m(int i) { return i * i; } } class B : A { } class C { static void Main() { A a = ne

如果我不将一个方法标记为
virtual
,它是否可用于派生类

如果使用object
a
,我将更改基类的方法。然后对象
b
访问基类的相同方法
m1()
(可用于派生类)

它会按对象
a
打印这些更改的值吗

他们会分享共同的方法吗

class A
{
    public int m(int i)
    {
        return i * i;
    }
}

class B : A
{
}

class C
{
    static void Main()
    {
        A a = new A();
        int x = a.m(2);    // returns 4

        B b = new B();
        int y = b.m(4);    // 16
    }
}
若我不使用虚方法,那个么它对派生类可用吗

是的,该方法将可用于任何派生类,但您将无法在派生类中重写此方法并更改其行为。在您的示例中,类
B
拥有
m1
方法,因为它派生自类
A
,但无法重写它,因为该方法不是虚拟的


事实上,您的示例甚至无法编译,因为您没有为
m1
方法指定返回类型。另外,如果不为方法指定一个函数,那么将假定
private
,您甚至无法在派生类中调用基方法(当然,除非使用反射)。(在@dtb编辑之后,代码现在将编译)

是,因为派生类是基类的一种类型

以哺乳动物为例。所有哺乳动物都会呼吸,所以我们会有哺乳动物。呼吸()。现在考虑一个猫类。既然猫是哺乳动物,我们可以把它看作是从哺乳动物中衍生出来的,那么已经有一个Cat.Breathe()继承自哺乳动物,没有任何额外的工作(“无额外工作”是OO的一个节省时间的方面)


如果哺乳动物.Breathe()是虚拟的,那么我们可以使它在Cat.Breathe()的情况下表现不同。如果它不是虚拟的,我们就不能,尽管非虚拟方法可以调用虚拟方法,这将使其行为的这一部分可以重写。

调试代码时您看到了什么?我明白了,先生,您的解释总是很有用……。我上面的程序是正确的,先生?我还想知道,如果使用对象“b”,我对超类的方法做了一些更改,然后我创建了一个新的类对象,然后如果我调用超类的对象“a”上的方法,该方法已经使用基类对象进行了更改,那么a.m1()将得到更改后的方法。我们再次回到隐藏和覆盖之间的区别。我建议您尝试各种可能性,并在调试器中逐步完成代码。这里和你其他问题的解释已经涵盖了相关理论,你需要了解实际发生的情况。我学到了你解释的所有内容,现在我做我自己的练习。如果我在某个地方绊倒了,我会回到你身边……谢谢你的帮助,并用例子详细解释了我的大部分疑问现在都清楚了