WebHU - Programozási kérdések és válaszok

C# öröklési koncepció tanácsot ad

Van egy kis lekérdezésem a C# OOP koncepciójával kapcsolatban.

Van egy kezelőfelületem

interface intf
{
   string Hello();
}

Alaposztály

public class BaseClass
{
   public string Hello()
   {
      return "Hello of base class called";
   }
}

Olyan gyermekosztály, amely a BaseClass-ból származik, és megvalósítja az interfész intf-jét is

public class ChildClass : BaseClass, intf
{
  string  Hello()
  {
     return "Hello of child class called";
  }
}

Most az a kérdésem, hogy amikor létrehozok egy ChildClass objektumot, akkor amikor a hello metódust hívom, az mindig a BaseClass hello metódusát hívja meg. Először is, miért hívja a BaseClass Hello-jét? Másodszor, hogyan hívhatom meg a ChildClass Hello-jét?

private void Form1_Load(object sender, EventArgs e)
{
      ChildClass obj = new ChildClass();
      MessageBox.Show(obj.Hello());
}
16.09.2010

  • Miért deklaráld a metódust a felületen is? Mit próbálsz elérni? Továbbá, tisztában van azzal a ténnyel, hogy explicit módon implementálhat egy interfészt? 16.09.2010
  • Nos, csak próbálom megtanulni a koneptusokat, és igen, tisztában vagyok vele, hogy ha megteszem az intf.hello-t, akkor ez az én interfész metódusomat fogja hívni. köszönöm a választ 16.09.2010

Válaszok:


1

Miért hívja a Hello of base-t

Az Ön gyermekosztálya valósítja meg az interfészt, ezért nyilvános Hello metódusnak minősül. De a gyerekosztályodban a Hello nem nyilvános. Az alaposztály Hello metódusa nyilvános, és az interfész megvalósításának tekinthető.

Hogyan hívjuk a Hello of Children osztályt

Tedd nyilvánossá a Hello in gyermek osztályt. Ezután az interfész megvalósításának tekintendő.

16.09.2010

2

Először is, nem adott meg hozzáférésmódosítót a Hello számára a ChildClass-ban. Ez alapértelmezés szerint priváttá teszi. Ha az osztályon kívülről szeretné elérni ezt a metódust, jelölje meg public (vagy internal értékkel, ha ugyanabból a névtérből használja). Jelenlegi állapotában az egyetlen nyilvánosan látható Hello metódus az az alaposztály metódusa.

Másodszor, miután megoldotta a hozzáférési problémát, a Hello elrejti a metódust az alapban. Ha ez szándékos, akkor célszerű a new kulcsszót használni a metódussal

public new string Hello()

Ha nem a metódus elrejtése, hanem felülírása volt a szándéka, jelölje meg virtuálisként a metódust az alaposztályban, és használja a felülírás kulcsszót a gyermekben.

public class ChildClass : BaseClass, intf
{
    public override string Hello()
    {
        return "Hello of child class called";
    }
}

public class BaseClass
{
    public virtual string Hello()
    {
        return "Hello of base class called";
    }
}

Ez lehetővé teszi, hogy mindig hívja meg az utód metódust, hacsak nem kifejezetten hívja meg az alapmetódusot a gyermekből.

Ilyen hívások a külvilágból

((BaseClass)child).Hello();
(child as BaseClass).Hello();
BaseClass baseClass = new ChildClass();
baseClass.Hello();

A gyermek módszert fogja használni.

Az ehhez hasonló hívások a gyermekosztályon belül

base.Hello();

Az alaposztály metódusát fogja használni.

16.09.2010

3

Deklarálja a metódust a virtual alaposztályban, majd override az utódosztályban. Így a virtuális hívás a szülő osztály helyett a gyermekosztályra fog feloldódni.

Frissítés: A kérdés megválaszolásához, hogy miért továbbra is ez az alapmetódus még azután is, hogy a metódus deklarációjában a new értéket adta meg:

Alapértelmezés szerint az osztály tagjai privátak. Ezért, mivel nem jelölte meg a metódust nyilvánosként, a metódus privát. Ezért a programok kénytelenek az alapmetódusnak hívni, mivel ez az egyetlen elérhető.

16.09.2010
  • Ezenkívül a gyermekosztály metódusának a következőnek kell lennie: public 16.09.2010
  • Esteban, köszönöm a választ, és egyetértek azzal, hogy a "hello of child"-t fogja hívni, amikor a virtuális és felülbíráló kulcsszavakat használom. Most hadd módosítsam egy kicsit a kódot, és adjak hozzá új kulcsszót a gyermekosztályom hello key-jéhez, ha most megnézem, továbbra is a hello of base-t hívja. MIÉRT? 16.09.2010
  • ellenőrizze a hibákat és a figyelmeztetéseket a projekt elkészítésekor. Ha nem megfelelő a virtual és override kulcsszava, akkor egy ilyen figyelmeztetést kap: „App.ChildClass.Hello()” elrejti az „App.BaseClass.Hello()” öröklött tagot. Használja az új kulcsszót, ha el akarta rejteni. 16.09.2010

  • 4

    Az a mód, ahogyan jelenleg deklaráltad a metódusaidat, a Hello() metódus a ChildClass-ban elérhetetlen, és így a BaseClass-ban lévő nyilvános metódus is meghívásra kerül. Valójában azt akarod, amit Esteban mondott, deklaráld a public virtual alapmódszert, a származtatott metódust public override, különben a metódusod csak árnyékolja az alaposztály metódusát.

    16.09.2010

    5

    Ahogyan azt már mondták, tegye nyilvánosan felülbírálhatóvá a Hello metódusát a Child osztályban.

    Továbbá, IMHO, az interfészt az alaposztályban kell megvalósítania, nem a gyermekosztályban. De ennek semmi köze ahhoz, hogy a módszeredet nem hívják meg.

    16.09.2010
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..