C#继承混淆

Vic*_*cky 3 c# inheritance

我试图实现Base类和Derived类的调用方法.但是,如果我正确地做的话,我有点困惑.我想从Base类中设置值并在Derived类中使用它们.

namespace Inheritance
{
    using System;

    public class BaseClass
    {
        public BaseClass() { }

        protected string methodName;
        protected int noOfTimes;
        public void Execute(string MethodName, int NoOfTimes)
        {
            this.methodName = MethodName;
            this.noOfTimes = NoOfTimes;
        }
    }

    public class DerivedClass : BaseClass
    {
        public DerivedClass() : base() { }

        public void Execute()
        {
            Console.WriteLine("Running {0}, {1} times", base.methodName, base.noOfTimes);
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            DerivedClass d = new DerivedClass();
            d.Execute("Func", 2);
            d.Execute();

            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:如果只使用1次执行而不是2次,我可以达到与上述相同的效果吗?

我希望上面的例子很清楚.如果不然,请告诉我,我会提供更多详情.

谢谢

Ada*_*rth 8

免责声明,我的回答假设你想要一个围绕方法的继承及其实现的解决方案.提供的其他答案也是问题的良好解决方案.

听起来你想要覆盖派生类中的方法.为此,基类需要标记方法virtualabstract.但是,在您的情况下,派生类方法签名是不同的.我会假设这是一个错误,不理解它是如何工作的,所以我已经为你纠正了它.

在这个例子中,派生类用overrideC#关键字标记方法.然后我调用,base.Execute(MethodName, NoOfTimes);因为我想在我的重写实现中使用基类的实现.然后我输入我自己的代码.

base 是另一个关键字,它允许您在您所在的类的正下方访问基类中的成员,而不会让继承链将您推回到派生成员中.

abstract值得一读,但在这种情况下不需要(它有不同的行为,virtual但也可以与之结合使用override).

namespace Inheritance
{
    using System;

    public class Program
    {
        internal protected class BaseClass
        {
            public BaseClass() { }

            protected string methodName;
            protected int noOfTimes;
            public virtual void Execute(string MethodName, int NoOfTimes)
            {
                this.methodName = MethodName;
                this.noOfTimes = NoOfTimes;
            }
        }

        internal class DerivedClass : BaseClass
        {
            public DerivedClass() : base() { }

            public override void Execute(string MethodName, int NoOfTimes)
            {
                base.Execute(MethodName, NoOfTimes);
                Console.WriteLine("Running {0}, {1} times", base.methodName, base.noOfTimes);
            }
        }

        static void Main(string[] args)
        {
            DerivedClass d = new DerivedClass();
            d.Execute("Func", 2);

            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个示例中有一些代码格式和命名怪癖,但我会单独留下它以尽可能接近原始代码.