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

Olyan fogalmak, ahol egy objektum úgy viselkedhet, mintha olyan interfészt valósítana meg, amelyhez rendelkezik a metódus aláírásával, anélkül, hogy kifejezetten implementálná az interfészt?

Azt szeretném kérdezni, hogy hasznos-e ez a fogalom, csináltak-e már más nyelvek ilyesmit, vagy ez az ötlet problémás vagy csak rossz. Ha problémás, akkor szintén nagyra értékelnénk annak magyarázatát, hogy milyen elveket sért meg.

Annak érdekében, hogy érthető legyen, mire gondolok, írtam néhány C# pszeudokódot, ahol létrehoztam egy képzeletbeli "lusta" kulcsszót, amely ennek az ötletnek a konkrét megvalósítását adja. A "lazy" kulcsszó arra utasítja a fordítót, hogy 1) explicit öntsön át minden olyan objektumot, amelynek funkciói megfelelnek egy interfészszerződésnek, még akkor is, ha a szóban forgó objektum nem valósítja meg kifejezetten az interfészt, és 2) ha az explicit cast függvény nem. t létezik, hozza létre, 3.) Az objektumot vissza lehet adni arra, ami volt, 4.) Ha az objektum nem valósítja meg az interfész által megkívánt metódusokat, fordítói hibát kap.

Ezután a következő kód lefordítható és lefutna.

class Program
{
    public interface iRoll
    {
        public void Roll();
        public int Dimensions { get; set;}
    }

    public class Basketball
    {
        public void Roll()
        {
            Console.WriteLine("I'm a rolling basketball");
        }
        private int _dimensions = 3;
        public int Dimensions { get { return _dimensions; } set { _dimensions = value; } }
        public string Brand = "BallCo.";
    }

    public class Tire
    {
        public void Roll()
        {
            Console.WriteLine("I'm a rolling tire");
        }
        private int _dimensions = 3;
        public int Dimensions { get { return _dimensions; } set { _dimensions = value; } }
    }

    static void Main(string[] args)
    {
        Tire MyTire = new Tire();
        Basketball MyBall = new Basketball();
        var myList = new List<iRoll>();
        myList.Add(lazy iRoll MyTire);
        myList.Add(lazy iRoll MyBall);
        foreach(iRoll myIRoll in myList)
        {
            myIRoll.Roll();
            Console.WriteLine("My dimensions: " + myIRoll.Dimensions);
        }
    }
}

Az előnyök nem mindig az, hogy az osztályok őrült módon valósítják meg az interfészeket, és nem kell egy alaposztályból származtatniuk az egyéni interfész megvalósításához, amikor az alaposztály már rendelkezik a szükséges metódusokkal és tulajdonságokkal (pl. bizonyos helyzetek külső könyvtárakkal, bizonyos felhasználói felülettel). vezérlők).

Jó ötlet, rossz ötlet, szörnyű ötlet? Más nyelvek kísérleteznek ezzel?


  • Nézze meg például a strukturális tipizálást (en.wikipedia.org/wiki/Structural_type_system) , a Go-ban. 16.05.2014
  • Úgy hangzik, mintha a strukturális gépelést írná le. 16.05.2014
  • Ez nagyjából pontosan leírja, hogy a Groovy hogyan kezeli az interfészeket, ha nem tévedek – Kivéve, hogy a groovy kevésbé explicit mechanizmusokat használ, minden explicit vagy implicit leadott úgy működik, mint a Lazy kulcsszó. Valójában hasonló szintaxisuk van, azt mondanád, hogy a MyTire iRoll-ként a lusta iRoll MyTire helyett. 16.05.2014
  • Valahogy tetszik az ötlet, hogy van egy kulcsszó, amivel ezt csak akkor teheti meg, ha kifejezetten akarja, bár nem hiszem, hogy a lusta feltétlenül a megfelelő szó (a lusta betöltéssel való asszociáció miatt). Talán olyasmi, mint a kényszer? 16.05.2014
  • (És ha ezt meg kell valósítanom, úgy gondolom, hogy az elemet egy dinamikus proxyba csomagolnám, amely megvalósította a felületet, és átadta a metódushívást az aktuális objektumnak.) 16.05.2014
  • Ez strukturális gépelésnek hangzik az alapján, amit egy pillantásra meg tudok állapítani, köszönöm – erről még fogok olvasni. A lusta egy szörnyű kulcsszónév lenne, szerintem. Csak azért választottam, mert... ahem. ;) 16.05.2014
  • Más néven kacsa gépelés 16.05.2014
  • A meglehetősen sikeres Go programozási nyelv erre a koncepcióra összpontosul: az interfész kielégítéséhez az érték típusának csak implementálnia kell az adott interfész által megkívánt metóduskészlet. A részletekért lásd ezt. 16.05.2014

Válaszok:


1

Köszönöm mindenkinek az információt. Találtam egy a sajátomhoz hasonló kérdést. érdekes információ. Két nagyon fontos kapcsolódó és eltérő fogalom, amelyeket érdemes megismerni: a strukturális tipizálás és a kacsa gépelés , mindkettő megfelelhet az eredeti kérdésemnek.

Példámban a C# névleges gépelést használ, amely nem kompatibilis a szerkezeti tipizálással. Az általam javasolt "lusta" kulcsszó egy olyan kulcsszó, amely arra készteti a nem szabályosan tipizált rendszereket, hogy bizonyos dolgokat hajtsanak végre, amelyek a programozó számára szerkezetileg tipizált rendszernek tűnnek. Ebben a példában ennek statikus gépelésnek kell lennie egy névlegesen gépelt nyelven.

Érdekelne, hogy valaki azt tudná-e mondani, hogy a lazy kulcsszó nem "igazán" duck typing, hanem szemantikus cukor, hogy az osztályok interfészeket valósítsanak meg, ha a lazy kulcsszó megvalósítási részletei miatt a fordító az osztályt működtette, hogy megvalósítsa a szükséges felületeket fordítási időben végrehajtani. Mindazonáltal azt gondolom, hogy a kacsa gépelés egy OOP fogalom, ezért ennek a kacsa gépelésnek kell lennie, függetlenül attól, hogy a fordító mit csinál, mindaddig, amíg a végeredmény kacsa gépelésként működik. Kérem, javítson ki bármit, amiben tévedek vagy nem értek egyet.

A Wikipédia-cikkben a kacsagépelésről található egy nagyszerű szakasz, amely számos példát mutat rá programozási nyelveken. .

16.05.2014
Ú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..