On Sun, 25 Oct 2009 02:22:51 +0300, Michel Fortin <[email protected]> wrote:

On 2009-10-24 18:45:10 -0400, Justin Johansson <[email protected]> said:

Let me try again.  You have a set of N things which are represented by
an enum definition.  There is some subset of this set containing M
things (so M < N) which represents the things meaningful in a public
sense.  The remaining Q=N-M members of the whole set are only meaningful
to some internal processing so this subset containing Q members are
designated private. I'm trying to think about this problem in an abstract
way; sometimes giving concrete examples like Color colors (pun intended)
the abstract problem.

Sounds like you want enum inheritance: one enum being a superset of another. :-)



It was previously proposed, but it was rejected because it works "backwards": downcasting is allowed while upcasting is prohibited.

Consider the following example (taken from DMD):

enum Token
{
    colon,
    semicolon,
    eof,
    // ...
    max,
}

enum AsmToken : Token // "extend" an existing enum
{
    dword, // = Token.max + 1 implicitly
    even,
    far,
    naked,
    near,
    ptr,
    qword,
    seg,
    word,
}

Now this is very useful, and less error prone than manual enum values management. Less jump to the usage:

AsmToken tok1 = Token.colon; // fine
Token tok2 = AsmToken.dword; // error

The two lines above are exact opposite of class/interface inheritance behavior:

class Token {}
class AsmToken : Token {}

AsmToken tok1 = new Token(); // error
Token tok2 = new AsmToken(); // fine

which makes sense but confusing for novices.

IIRC, Walter rejected the feature for exactly this reason.

Reply via email to