Nové slovo v rozhraní v jazyce C #

hlasů
3
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();
        }
    }
}

nové klíčové slovo v komentářem vedení je trochu matoucí pro mě. To jsut znamenat, že má přednost provádění metody v základní třídě. Proč nevyužít klíčové slovo override?

Položena 27/08/2009 v 01:01
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
9

Naleznete v následujícím článku na webu MSDN: vědět, kdy použít Přepis i nových klíčových slov

Odpovězeno 27/08/2009 v 01:03
zdroj uživatelem

hlasů
0

Obecně platí, že v případě rozhraní IBase implementuje člen DoSomething a IDerived dědí / implementuje IBASE, se očekává, že bude IDerived.DoSomething synonymem IBase.DoSomething. Obecně platí, že je to užitečné, protože šetří realizátorů třídy z nutnosti použití redundantní implementace. Existují však některé případy, kdy musí být odvozené rozhraní realizovat člen, který má stejný název jako člen v základním rozhraní, které však budou muset být implementovány odděleně. Nejběžnější takové situace (1) odvozený způsob bude mít jiný typ návratu z základního typu, nebo (2) základny rozhraní (y) implementuje ReadOnly a / nebo writeonly vlastnosti (y) s určitou a odvozené typ musí implementovat vlastnost pro čtení i zápis. Z nějakého důvodu, pokud interface IReadableFoo poskytuje vlastnost jen pro čtení Foo, IWritableFoo poskytuje jen pro zápis vlastnosti foo a interface IMutableFoo prostě dědí jak bude překladač neví, zda je odkaz na Foo označuje IReadableFoo.Foo nebo IWritableFoo. foo. I když jen IReadableFoo.Foo lze číst, a to pouze IWritableFoo.Foo může být písemná, ani vb.net ani C # lze vyřešit přetížení pokud člověk implementuje nové čtení a zápis majetku Foo který zvládá oboje.

Odpovězeno 24/07/2011 v 20:42
zdroj uživatelem

hlasů
0

Není to opravdu naléhavé, je to stínování ho. Vzhledem k tomu, odkaz na Derivedobjekt, Baseje HelpMeNowfunkce nebude přístupná 1 , a derivedObject.HelpMeNow()vyzve Derivedje implementace.

To není to samé jako převažující virtuální funkci, která HelpMeNownení. V případě, že Derivedje objekt uložen v odkazu na Base, nebo na IHelper, pak Baseto HelpMeNow()bude jmenovat, a Derivedto realizace bude nepřístupné.

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()"

Samozřejmě, že pokud výše uvedené není požadované chování, a to je obvykle ne, existují dvě možnosti. Máte-li ovládat Base, jednoduše změnit HelpMeNow()na virtuální, a přepsat ji Derivednamísto stínový ji. Pokud nechcete řídit Base, pak můžete aspoň opravit do poloviny, tím reimplementing IHelper, tak jako:

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

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

Tato verze Derivedpoužití, co se nazývá implementace explicitní rozhraní , které vám umožní uspokojit smlouvu na implementaci rozhraní bez přidání provádění veřejného rozhraní vaší třídy je. V tomto případě už máme implementaci v Derived‚s veřejného rozhraní, které je zdědil po Base, takže se musíme explicitně implementovat IHelperjej změnit 2 . V tomto příkladu jsme právě předal implementaci IHelper.HelpMeNowdo našeho veřejného rozhraní, které je stín Baseočím.

Takže s touto změnou, výzva k baseReference.HelpMeNow()ještě výstupy „Base.HelpMeNow ()“, ale volání helperReference.HelpMeNow()se nyní výstup „Derived.HelpMeNow ()“. Ne tak dobrý jako změna Base‚s implementaci do virtuální, ale tak dobré, jak budeme mít, pokud nemáme kontrolu Base.

1 Výjimka: to je dostupný z metod Derived, ale pouze v případě, kvalifikován base.jako v base.HelpMeNow().
2. Všimněte si, že musíme také deklarovat IHelperjako prostředník třídní nářadí, i když jsme zdědí toto prohlášení z Base.

Odpovězeno 27/08/2009 v 01:33
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more