<html>
  <head>
    <meta content="text/html; charset=KOI8-R" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Awesome! Thank you very much! It does look more elegant than using
    method overrides.<br>
    <br>
    On 8/24/2011 4:20 PM, Jon Rafkind wrote:
    <blockquote cite="mid:4E555CF8.3020900@cs.utah.edu" type="cite">
      <meta content="text/html; charset=KOI8-R"
        http-equiv="Content-Type">
      Here is the code. I had to split the abstract methods from the
      concrete methods in the interface. The trick with mixins is that
      they can't be instantiated themselves, you have to apply them to
      some class and then instantiate that class.<br>
      <br>
      #lang racket<br>
      <br>
      (provide<br>
      š first-child-class%<br>
      š second-child-class%)<br>
      <br>
      (define child-interface-partial<br>
      š (interface ()<br>
      šššššššššššš child-method<br>
      šššššššššššš ))<br>
      <br>
      (define child-interface<br>
      š (interface (child-interface-partial)<br>
      šššššššššššš child-implementation-dependent-method))<br>
      <br>
      #;<br>
      (define generic-parent-class%<br>
      š (class* object% ()<br>
      ššššššššš (super-new)<br>
      ššššššššš (define/public (child-method this-time) (error
      'child-method "abstract method"))<br>
      ššššššššš (define/public (child-implementation-dependent-method
      given-inputs-list)<br>
      ššššššššššš (map<br>
      ššššššššššššš (lambda(this-item)<br>
      ššššššššššššššš (eprintf "Next list item is ~v" (child-method
      this-item)))<br>
      ššššššššššššš given-inputs-list))))<br>
      <br>
      (define generic-parent-class-mixin<br>
      š (mixin (child-interface-partial)<br>
      šššššššš (child-interface)<br>
      <br>
      šššššššš (define/public (child-implementation-dependent-method
      given-inputs-list)<br>
      ššššššššššš (map<br>
      ššššššššššššš (lambda(this-item)<br>
      ššššššššššššššš (eprintf "Next list item is ~v\n" (send this
      child-method this-item)))<br>
      ššššššššššššš given-inputs-list))<br>
      <br>
      šššššššš (super-new)))<br>
      <br>
      (define first-child-class%<br>
      š (generic-parent-class-mixin<br>
      ššššš (class* object% (child-interface-partial)<br>
      ššššššššššššš (super-new)<br>
      ššššššššššššš (define/public (child-method given-input)<br>
      ššššššššššššššš (string-append "First gotš " given-input)))))<br>
      <br>
      (define second-child-class%<br>
      š (generic-parent-class-mixin<br>
      ššš (class* object% (child-interface-partial)<br>
      ššššššššššš (super-new)<br>
      ššššššššššš (define/public (child-method given-input)<br>
      ššššššššššššš (string-append "Second gotš " given-input)))))<br>
      <br>
      (define x1 (new first-child-class%))<br>
      (define x2 (new second-child-class%))<br>
      <br>
      (send x1 child-implementation-dependent-method '("a" "b" "c"))<br>
      (send x2 child-implementation-dependent-method '("a" "b" "c"))<br>
      <br>
      Output:<br>
      Next list item is "First gotš a"<br>
      Next list item is "First gotš b"<br>
      Next list item is "First gotš c"<br>
      '(#&lt;void&gt; #&lt;void&gt; #&lt;void&gt;)<br>
      Next list item is "Second gotš a"<br>
      Next list item is "Second gotš b"<br>
      Next list item is "Second gotš c"<br>
      '(#&lt;void&gt; #&lt;void&gt; #&lt;void&gt;)<br>
      <br>
      <br>
      On 08/24/2011 11:18 AM, Alexander Kasiukov wrote:
      <blockquote cite="mid:4E553267.1080100@sunysuffolk.edu"
        type="cite">
        <meta http-equiv="content-type" content="text/html;
          charset=KOI8-R">
        Dear Jon,<br>
        <br>
        Thank you very much for your help! I got what I needed to work
        with method overrides (following a suggestion of Robby Findler),
        but it does look like mixins may give a less redundant way to
        accomplish the same functionality. I am at a loss trying to
        understand how to make them work based on the Bakus-Naur
        description. (I am just starting to learn Racket and Lisp in
        general.) Could you show an example or suggest a place where I
        can look up one? I am trying to do something along the lines of
        <br>
        <br>
        <small><small>#lang racket</small></small><br>
        <br>
        <small><small>(provide<br>
            ššš first-child-class%<br>
            ššš second-child-class%)<br>
            <br>
            (define child-interface<br>
            ššš (interface ()<br>
            ššš ššš child-implementation-dependent-method<br>
            ššš ššš child-method))<br>
            <br>
            (define generic-parent-class%<br>
            ššš (class* object% ()<br>
            ššš ššš (super-new)<br>
            ššš ššš (define/public (child-method this-time) (error
            'child-method "abstract method"))<br>
            ššš ššš (define/public
            (child-implementation-dependent-method given-inputs-list)<br>
            ššš ššš ššš (map<br>
            ššš ššš ššš ššš (lambda(this-item)<br>
            ššš ššš ššš ššš ššš (eprintf "Next list item is ~v"
            (child-method this-item)))<br>
            ššš ššš ššš ššš given-inputs-list))))<br>
            <br>
            (define first-child-class%<br>
            ššš (class* generic-parent-class% (child-interface)<br>
            ššš ššš (super-new)<br>
            ššš ššš (define/override (child-method given-input)<br>
            ššš ššš ššš (string-append "First gotš " given-input))))<br>
            <br>
            (define second-child-class%<br>
            ššš (class* generic-parent-class% (child-interface)<br>
            ššš ššš (super-new)<br>
            ššš (define/override (child-method given-input)<br>
            ššš ššš (string-append "Second gotš " given-input))))</small></small><br>
        <br>
        Sincerely yours,<br>
        Alex<br>
        <blockquote type="cite">
          <pre wrap="">Date: Wed, 24 Aug 2011 09:04:40 -0600
From: Jon Rafkind <a moz-do-not-send="true" class="moz-txt-link-rfc2396E" href="mailto:rafkind@cs.utah.edu">&lt;rafkind@cs.utah.edu&gt;</a>
To: <a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:users@racket-lang.org">users@racket-lang.org</a>
Subject: Re: [racket] How to use abstract classes?
Message-ID: <a moz-do-not-send="true" class="moz-txt-link-rfc2396E" href="mailto:4E551308.5020503@cs.utah.edu">&lt;4E551308.5020503@cs.utah.edu&gt;</a>
Content-Type: text/plain; charset=ISO-8859-1

You could use a mixin. <a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://docs.racket-lang.org/reference/mixins.html?q=mixin&amp;q=class#%28form._%28%28lib._racket/private/class-internal..rkt%29._mixin%29%29">http://docs.racket-lang.org/reference/mixins.html?q=mixin&amp;q=class#(form._((lib._racket/private/class-internal..rkt)._mixin))</a>

On 08/24/2011 08:31 AM, Alexander Kasiukov wrote:
</pre>
          <blockquote type="cite" style="color: #000000;">
            <pre wrap="">Dear Racket users,

What is the best way to make a class in Racket abstract? I would like to have a class which

    never gets instantiated
    implements certain methods common to all of its children
    needs to call some of the methods implemented in the children.

Sincerely yours,
Alex</pre>
          </blockquote>
        </blockquote>
        <br>
      </blockquote>
      <br>
    </blockquote>
  </body>
</html>