Come supportare l'ereditarietà durante la progettazione di una lingua OO senza classi

5

Sto progettando un linguaggio di programmazione per un gioco, da utilizzare come modo principale di interagire con il gioco, anziché utilizzare altri metodi di controllo, come i tasti freccia o il mouse. Il mio piano è di avere gli oggetti del gioco di controllo utente attraverso gli oggetti nella lingua.

if unit1.health > 20 {

    unit1.attack(Enemies.enemy1)

}

Dove unit1 e enemy1 sono gli oggetti. Ciò può essere fatto in modo relativamente semplice, tuttavia vorrei anche che il linguaggio con cui l'utente interagisce sia un linguaggio reale e che gli oggetti del gioco come unit1 si comportino in modo simile agli oggetti creati dall'utente.

Non ho intenzione di aggiungere classi o qualcosa di simile. Tutti gli attributi di un oggetto sono pubblici per impostazione predefinita e di sola lettura e i metodi sono solo attributi che sono oggetti funzione. Non è inoltre possibile aggiungere attributi ad un oggetto. L'unica volta in cui l'utente può accedere all'interna di un oggetto è al momento della creazione, in quanto è necessario per impedire all'utente di modificare gli oggetti del gioco.

C'è un modo per aggiungere una funzionalità al linguaggio che permetta all'utente di fare qualcosa come l'ereditarietà o qualcosa che permetta di scrivere facilmente un codice complesso, pur mantenendo il linguaggio "puro" e semplice?

In questo momento, il massimo che puoi fare è qualcosa di simile a:

fake_class = function(x, y) {
    {
        self.x = x
        self.y = y
        z = "hi" // private
        self.change_x_and_print_z = function(new) {
                                        self.x = new
                                        print(z)
                                    }
    }
}

new_obj = fake_class(4, 5)

Ma posso pensare ad un modo per estendere l'oggetto, poiché è di sola lettura e solo mutabile da dentro di sé.

    
posta Vityou 16.12.2017 - 02:56
fonte

2 risposte

5

Permetti di creare un nuovo oggetto come clone di un oggetto esistente con nuove proprietà.

Quindi ad esempio:

function Base() {
    z = 5
    return {
       x: 2,
       y: 4,
       print_z: function() {
           print(z)
       }
    }
}

function Child() {
     return {
         ...Base(), // start with copy of base
         g: 5,
         h: 3, // add my own stuff
     }
}
    
risposta data 16.12.2017 - 03:50
fonte
3

Esistono diverse alternative all'eredità basata sulla classe che sono già state esplorate

  • Delega di prototipi: gli oggetti possono avere uno o più riferimenti speciali ad altri oggetti. Quando un oggetto non capisce un messaggio, il messaggio viene inoltrato agli oggetti referenziati da quei riferimenti speciali . Alcune delle prime lingue che hanno esplorato questa idea erano Self e Act-1, il primo commerciale era NewtonScript, e il più famoso è ECMAScript. Le decisioni di progettazione sono: delegazione singola (ECMAScript) o multipla (Self) e se tali riferimenti siano o meno "magici" (ECMAScript) o solo campi normali che è possibile assegnare a volontà (Self).

  • Ereditarietà dei mixin: i mixin possono essere pensati come "classi parametrizzate sulla loro superclasse" o come "pacchetti di metodi componibili".

  • Composizione del tratto: i tratti sono simili a Mixin con dipendenze dichiarate e risoluzione dei conflitti (ad esempio Metodo Nascondere e rinominare).

Il più semplice di questi, concettualmente, è la Delegazione Prototipo. È anche quello con cui gli utenti avranno maggiore familiarità, se si sono dilettati nella programmazione web.

In Self, i prototipi sono solo campi regolari il cui nome termina con un asterisco * . I messaggi vengono nuovamente inviati ai campi in ordine alfabetico, fino a quando qualcuno risponde o viene generato un messaggio doesNotUnderstand: , che quindi segue nuovamente le stesse regole di ricerca. Se anche il messaggio doesNotUnderstand: non viene risposto, viene sollevata un'eccezione NoMethodFoundError .

Poiché i prototipi sono solo campi regolari, puoi creare, eliminare e riassegnare a piacimento, proprio come ogni altro campo.

    
risposta data 16.12.2017 - 12:51
fonte

Leggi altre domande sui tag