New word in interfaces in C #

using System;

namespace random

{

    interface IHelper
    {
        void HelpMeNow();
    }
    public class Base : IHelper
    {
        public void HelpMeNow()
        {
            Console.WriteLine("Base.HelpMeNow()");
        }
    }
    public class Derived : Base
    {
        public new void HelpMeNow()            ///this line
        {
            Console.WriteLine("Derived.HelpMeNow()");
        }
    }
    class Test
    {
        public static void Main()
        {
            Derived der = new Derived();
            der.HelpMeNow();
            IHelper helper = (IHelper)der;
            helper.HelpMeNow();
            Console.ReadLine();
        }
    }
}

the new keyword in the comments is a little confusing to me. This means that it overrides the method implementation in the base class. Why not use the override keyword?

+3
source share
3 answers

This does not cancel it; it obscures . Given a reference to an object Derived, the function Base HelpMeNowwill not be available 1 but derivedObject.HelpMeNow()will call an implementation Derived.

, , HelpMeNow . Derived Base IHelper, Base HelpMeNow(), Derived .

Derived derivedReference = new Derived();
Base    baseReference    = derivedReference;
IHelper helperReference  = derivedReference;

derivedReference.HelpMeNow(); // outputs "Derived.HelpMeNow()"
baseReference.HelpMeNow();    // outputs "Base.HelpMeNow()"
helperReference.HelpMeNow();  // outputs "Base.HelpMeNow()"

, , , . Base, HelpMeNow() Derived , . Base, , IHelper, :

class Derived : Base, IHelper{
    public new void HelpMeNow(){Console.WriteLine("Derived.HelpMeNow()");}

    void IHelper.HelpMeNow(){HelpMeNow();}
}

Derived , , . Derived , Base, IHelper, 2. IHelper.HelpMeNow , Base.

, baseReference.HelpMeNow() - "Base.HelpMeNow()", helperReference.HelpMeNow() "Derived.HelpMeNow()". , Base , , , Base.

1 : Derived, base., base.HelpMeNow().
2 , IHelper , , Base.

0

. MSDN: ,

+9

, IBase DoSomething, IDerived / Ibase, , IDerived.DoSomething IBase.DoSomething. , , . , , , , . : (1) (2) () Readonly / WriteOnly Read-Write. - , IReadableFoo Foo , IWritableFoo Foo, IMutableFoo , , Foo IReadableFoo.Foo IWritableFoo. Foo. , IReadableFoo.Foo, IWritableFoo.Foo, vb.net, # , Foo , .

0
source

Source: https://habr.com/ru/post/1716164/


All Articles