关于继承:C#heritage:从子调用的父方法调用子方法

C# heritage : Call child method from parent method called by child

我在这里面临一个问题,假设我有一个父类:

1
2
3
4
5
6
7
8
9
10
11
12
13
class ParentClass
{
    public void MethodA()
    {
        //Do stuff
        MethodB();
    }

    public void MethodB()
    {
        //Do stuff
    }
}

继承ParentClass并重写methodB()的子类:

1
2
3
4
5
6
7
class ChildClass : ParentClass
{
    public new void MethodB()
    {
        //Do stuff
    }
}

现在,如果我从ChildClass对象调用methoda()。

1
2
3
4
5
public static void Main()
{
    ChildClass childObject = new ChildClass();
    childObject.MethodA();
}

如何确保将调用的methodb()将是子类中的方法?


如果您通过使方法在父类中成为虚拟的,并通过向子类中的方法添加返回值来修复编译错误,那么它将正常工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ParentClass
{
    …

    public virtual void MethodB()
    {
        //Do stuff
    }
}
class ChildClass : ParentClass
{
    public override void MethodB()
    {
        //Do stuff
    }
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using System;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            var childObject = new ChildClass();

            childObject.MethodA();
            childObject.MethodB();
            childObject.MethodC();

            Console.ReadLine();
        }
    }

    class ParentClass
    {
        public void MethodA()
        {
            //Do stuff
            _MethodB();
        }

        private void _MethodB()
        {
            Console.WriteLine("[B] I am called from parent.");
        }

        public virtual void MethodB()
        {
            _MethodB();
        }

        public void MethodC()
        {
            Console.WriteLine("[C] I am called from parent.");
        }
    }

    class ChildClass : ParentClass
    {
        public override void MethodB()
        {
            Console.WriteLine("[B] I am called from chield.");
        }

        public new void MethodC()
        {
            Console.WriteLine("[C] I am called from chield.");
        }
    }
}

enter image description here