On 2013-01-05, Simon King <simon.k...@uni-jena.de> wrote:
> Hi John,
>
> On 2013-01-05, john_perry_usm <john.pe...@usm.edu> wrote:
>> thinking of how java interfaces & multiple inheritance work:
>> wouldn't it be possible to have an interface orabstract class
>> that defines an abstract function abs, along with associated
>> functions that require an abs functions, then declare in the
>> class header that it implements it, and define the function so?
>
> The category framework offers such functionality. For example, one
> could define the following in sage.categories.rings:
>
> from sage.misc.abstract_method import abstract_method
> class Rings(Category):
>     ...
>     class ElementMethods:
>         @abstract_method(optional=True)
>         def abs(self):
>             """
>             Return the absolute value. Implement only if that
>             makes sense in this ring.
>             """
>             pass
>
> and then, for example:
>
>   sage: from sage.structure.element import Element
>   sage: from sage.structure.parent import Parent
>   sage: class MyRingElement(Element):
>   ....:     def _mul_(self, other):
>   ....:         return self
>   ....: 
>   sage: class MyRingElementWithAbs(MyRingElement):
>   ....:     def abs(self):
>   ....:         return self
>   ....:     
>   sage: class MyRing(Parent):
>   ....:     def __init__(self, has_abs=None):
>   ....:         if has_abs:
>   ....:             self.Element = MyRingElementWithAbs
>   ....:         else:
>   ....:             self.Element = MyRingElement
>   ....:         Parent.__init__(self, category=Rings())
>   ....:     def _element_constructor_(self, *args, **kwds):
>   ....:         return self.element_class(parent=self)
>   ....:     
>   sage: R = MyRing()
>   sage: RAbs = MyRing(has_abs=True)
>   sage: a = R()
>   sage: b = RAbs()
>   sage: b.abs
>  <bound method MyRing_with_category.element_class.abs of Generic
>   element of a structure>
>   sage: b.abs()
>   Generic element of a structure
>   sage: hasattr(a, 'abs')   # yes, still available by tab completion
>   True
>   sage: a.abs     # but that's good:
>   NotImplemented

this is still a hack, as R() might in principle not have anything to do
with abs(). In such a case NotImplemented is misleading, and it better
be that hasattr(a, 'abs')==False



>   sage: a.__class__.abs?
>   ...
>   Definition:     a.__class__.abs(self)
>   Docstring:
>          Return the absolute value. Implement only if that makes sense in
>        this ring.
>   ...
>
> I guess the main problem is that the abs() method of
> sage.structure.element.RingElement has been introduced long before the
> category framework was created. But we could consider to move abs() from
> the base class RingElement to the element class of the category of
> rings. The question is how to deal with old code, that tries to
> implement abs() by means of __abs__().
>
> Best regards,
> Simon
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To post to this group, send email to sage-devel@googlegroups.com.
To unsubscribe from this group, send email to 
sage-devel+unsubscr...@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-devel?hl=en.


Reply via email to