RE: [flexcoders] AS3 interface question

2008-06-27 Thread Rick Winscot
Can't sleep again. blogged a solution to implementing covariant return
types. 

 

http://www.quilix.com/node/17

 

Rick Winscot

 

 

From: flexcoders@yahoogroups.com [mailto:[EMAIL PROTECTED] On
Behalf Of Ralf Bokelberg
Sent: Thursday, June 26, 2008 9:22 AM
To: flexcoders@yahoogroups.com
Subject: Re: [flexcoders] AS3 interface question

 

Yep, it's a language feature, which is not there. I think it is called
covariant return types.
Afaik, all you can do is check the type and cast.
Cheers
Ralf.

On Thu, Jun 26, 2008 at 3:14 PM, diehlryan [EMAIL PROTECTED]
mailto:rdiehl%40docfinity.com  wrote:
 I'm running into a wall when trying to use extension with interfaces.
 The example I'm about to provide works using Java, so I believe the
 OOP practices behind it are valid. But I can't figure out how to
 accomplish the same thing in Flex, I keep running into compiler
 issues. The example is a condensed version of something I'm working
 on, for simplicity sake.

 Let's say you have a bunch of events that all have some common
 functionality, like the ability to have a nextEvent. Also, a subset
 of those events also have additional functionality, they can be
 filtered by a type of criteria. We'll call them search events.

 Now, there are some parts of the application that can work with any
 type of search event, and any type of criteria. But when the
 individual searches are executed, that implementation expects a
 specific type of search event and search criteria. That's my end goal
 here.

 Here are the interfaces I'm using:

 public interface ICriteria
 {
 // just a marker
 }

 public interface ICustomCriteria extends ICriteria
 {
 function get name():String;
 function set name(name:String):void;
 }

 public interface IEvent
 {
 function get nextEvent():IEvent;
 function set nextEvent(event:IEvent):void;
 }

 public interface ISearchEvent
 {
 function get criteria():ICriteria;
 function set criteria(criteria:ICriteria):void;
 }

 So far, so good. And now the implementing classes:

 // would like to make this an abstract class, but not supported in AS
 public class BaseEvent implements IEvent
 {
 private var _nextEvent:IEvent;

 public function set nextEvent(event:IEvent):void
 {
 this._nextEvent = event;
 }

 public function get nextEvent():IEvent
 {
 return this._nextEvent;
 }
 }

 // would like to make this an abstract class, but not supported in AS
 public class BaseSearchEvent extends BaseEvent implements ISearchEvent
 {
 private var _criteria:ICriteria;

 public function set criteria(criteria:ICriteria):void
 {
 this._criteria = criteria;
 }

 public function get criteria():ICriteria
 {
 return this._criteria;
 }
 }

 Those base classes are fine and compile correctly. Now if you
 remember from the requirements, there are some places that can work
 with any type of ISearchEvent, and some places that can only work with
 an individual subclass. Here is where the compiler errors come in.
 Doing what I am about to do works in Java, and I'm wondering if there
 is a way to accomplish it in AS3.

 public class CustomSearchEvent extends BaseSearchEvent
 {
 private var _criteria:ICustomCriteria;

 public override function get criteria():ICustomCriteria
 {
 return this._criteria;
 }

 public override function set criteria(criteria:ICustomCriteria):void
 {
 this._criteria = criteria;
 }
 }

 The above class does not compile because the method signatures for
 get/set criteria are different than those specified in the interface.
 But from an OO perspective, I think this is a valid thing to want to
 do. If you're working with an ISearchEvent instance, you should be
 able to subclass the base class and provide custom behavior. The
 ICustomCriteria is a subclass of ICriteria, so you should be able to
 substitute them in this context. Is there another way to accomplish
 this? Or is this just a language feature that's not there?

 

 



RE: [flexcoders] AS3 interface question

2008-06-27 Thread Gordon Smith
As far as I know, Adobe plans to follow the emerging Ecmascript 4
standard. We're unlikely to support covariant return types in
ActionScript unless ES4 has them.

 

Gordon Smith

Adobe Flex SDK Team

 



From: flexcoders@yahoogroups.com [mailto:[EMAIL PROTECTED] On
Behalf Of Rick Winscot
Sent: Thursday, June 26, 2008 10:30 PM
To: flexcoders@yahoogroups.com
Subject: RE: [flexcoders] AS3 interface question

 

By the way... there is an open issue in the Adobe bug-base regarding
this. Vote for it! NOW!

 

http://bugs.adobe.com/jira/browse/ASC-3442
http://bugs.adobe.com/jira/browse/ASC-3442 

 

Rick Winscot

 

 

From: flexcoders@yahoogroups.com [mailto:[EMAIL PROTECTED] On
Behalf Of Ralf Bokelberg
Sent: Thursday, June 26, 2008 9:22 AM
To: flexcoders@yahoogroups.com
Subject: Re: [flexcoders] AS3 interface question

 

Yep, it's a language feature, which is not there. I think it is called
covariant return types.
Afaik, all you can do is check the type and cast.
Cheers
Ralf.

On Thu, Jun 26, 2008 at 3:14 PM, diehlryan [EMAIL PROTECTED]
mailto:rdiehl%40docfinity.com  wrote:
 I'm running into a wall when trying to use extension with interfaces.
 The example I'm about to provide works using Java, so I believe the
 OOP practices behind it are valid. But I can't figure out how to
 accomplish the same thing in Flex, I keep running into compiler
 issues. The example is a condensed version of something I'm working
 on, for simplicity sake.

 Let's say you have a bunch of events that all have some common
 functionality, like the ability to have a nextEvent. Also, a subset
 of those events also have additional functionality, they can be
 filtered by a type of criteria. We'll call them search events.

 Now, there are some parts of the application that can work with any
 type of search event, and any type of criteria. But when the
 individual searches are executed, that implementation expects a
 specific type of search event and search criteria. That's my end goal
 here.

 Here are the interfaces I'm using:

 public interface ICriteria
 {
 // just a marker
 }

 public interface ICustomCriteria extends ICriteria
 {
 function get name():String;
 function set name(name:String):void;
 }

 public interface IEvent
 {
 function get nextEvent():IEvent;
 function set nextEvent(event:IEvent):void;
 }

 public interface ISearchEvent
 {
 function get criteria():ICriteria;
 function set criteria(criteria:ICriteria):void;
 }

 So far, so good. And now the implementing classes:

 // would like to make this an abstract class, but not supported in AS
 public class BaseEvent implements IEvent
 {
 private var _nextEvent:IEvent;

 public function set nextEvent(event:IEvent):void
 {
 this._nextEvent = event;
 }

 public function get nextEvent():IEvent
 {
 return this._nextEvent;
 }
 }

 // would like to make this an abstract class, but not supported in AS
 public class BaseSearchEvent extends BaseEvent implements ISearchEvent
 {
 private var _criteria:ICriteria;

 public function set criteria(criteria:ICriteria):void
 {
 this._criteria = criteria;
 }

 public function get criteria():ICriteria
 {
 return this._criteria;
 }
 }

 Those base classes are fine and compile correctly. Now if you
 remember from the requirements, there are some places that can work
 with any type of ISearchEvent, and some places that can only work with
 an individual subclass. Here is where the compiler errors come in.
 Doing what I am about to do works in Java, and I'm wondering if there
 is a way to accomplish it in AS3.

 public class CustomSearchEvent extends BaseSearchEvent
 {
 private var _criteria:ICustomCriteria;

 public override function get criteria():ICustomCriteria
 {
 return this._criteria;
 }

 public override function set criteria(criteria:ICustomCriteria):void
 {
 this._criteria = criteria;
 }
 }

 The above class does not compile because the method signatures for
 get/set criteria are different than those specified in the interface.
 But from an OO perspective, I think this is a valid thing to want to
 do. If you're working with an ISearchEvent instance, you should be
 able to subclass the base class and provide custom behavior. The
 ICustomCriteria is a subclass of ICriteria, so you should be able to
 substitute them in this context. Is there another way to accomplish
 this? Or is this just a language feature that's not there?

 

 



Re: [flexcoders] AS3 interface question

2008-06-26 Thread Ralf Bokelberg
Yep, it's a language feature, which is not there. I think it is called
covariant return types.
Afaik, all you can do is check the type and cast.
Cheers
Ralf.

On Thu, Jun 26, 2008 at 3:14 PM, diehlryan [EMAIL PROTECTED] wrote:
 I'm running into a wall when trying to use extension with interfaces.
 The example I'm about to provide works using Java, so I believe the
 OOP practices behind it are valid. But I can't figure out how to
 accomplish the same thing in Flex, I keep running into compiler
 issues. The example is a condensed version of something I'm working
 on, for simplicity sake.

 Let's say you have a bunch of events that all have some common
 functionality, like the ability to have a nextEvent. Also, a subset
 of those events also have additional functionality, they can be
 filtered by a type of criteria. We'll call them search events.

 Now, there are some parts of the application that can work with any
 type of search event, and any type of criteria. But when the
 individual searches are executed, that implementation expects a
 specific type of search event and search criteria. That's my end goal
 here.

 Here are the interfaces I'm using:

 public interface ICriteria
 {
 // just a marker
 }

 public interface ICustomCriteria extends ICriteria
 {
 function get name():String;
 function set name(name:String):void;
 }

 public interface IEvent
 {
 function get nextEvent():IEvent;
 function set nextEvent(event:IEvent):void;
 }

 public interface ISearchEvent
 {
 function get criteria():ICriteria;
 function set criteria(criteria:ICriteria):void;
 }

 So far, so good. And now the implementing classes:

 // would like to make this an abstract class, but not supported in AS
 public class BaseEvent implements IEvent
 {
 private var _nextEvent:IEvent;

 public function set nextEvent(event:IEvent):void
 {
 this._nextEvent = event;
 }

 public function get nextEvent():IEvent
 {
 return this._nextEvent;
 }
 }

 // would like to make this an abstract class, but not supported in AS
 public class BaseSearchEvent extends BaseEvent implements ISearchEvent
 {
 private var _criteria:ICriteria;

 public function set criteria(criteria:ICriteria):void
 {
 this._criteria = criteria;
 }

 public function get criteria():ICriteria
 {
 return this._criteria;
 }
 }

 Those base classes are fine and compile correctly. Now if you
 remember from the requirements, there are some places that can work
 with any type of ISearchEvent, and some places that can only work with
 an individual subclass. Here is where the compiler errors come in.
 Doing what I am about to do works in Java, and I'm wondering if there
 is a way to accomplish it in AS3.

 public class CustomSearchEvent extends BaseSearchEvent
 {
 private var _criteria:ICustomCriteria;

 public override function get criteria():ICustomCriteria
 {
 return this._criteria;
 }

 public override function set criteria(criteria:ICustomCriteria):void
 {
 this._criteria = criteria;
 }
 }

 The above class does not compile because the method signatures for
 get/set criteria are different than those specified in the interface.
 But from an OO perspective, I think this is a valid thing to want to
 do. If you're working with an ISearchEvent instance, you should be
 able to subclass the base class and provide custom behavior. The
 ICustomCriteria is a subclass of ICriteria, so you should be able to
 substitute them in this context. Is there another way to accomplish
 this? Or is this just a language feature that's not there?

 


RE: [flexcoders] AS3 interface question

2008-06-26 Thread Rick Winscot
This is the monkey Ralf. and it can be a nasty one. It is possible to nerf
return types and arguments by using an indeterminate type.

 

Public function get foo():*

 

.and.

 

Public function set foo( bar:* ):void

 

Which will leave you switching a lot to keep things straight. The 'generics'
approach can be helpful. but keep in mind that highly abstract software is
beautiful. rarely (truly) functional and always difficult to maintain
(wink). The benefit(s) of this level of granularity in ActionScript is
arguable. and lays a heavy burden on all aspects of the system - especially
around maintenance. I am fully aware of the great power and flexibility of
having principles of substitution available in a language - so don't take me
for a 'nay-sayer.' What I am trying to say is. that ActionScript 3 offers
the dynamic class and indeterminate types which will get you 95.67% of the
way there.

 

Rick Winscot

 

 

From: flexcoders@yahoogroups.com [mailto:[EMAIL PROTECTED] On
Behalf Of Ralf Bokelberg
Sent: Thursday, June 26, 2008 9:22 AM
To: flexcoders@yahoogroups.com
Subject: Re: [flexcoders] AS3 interface question

 

Yep, it's a language feature, which is not there. I think it is called
covariant return types.
Afaik, all you can do is check the type and cast.
Cheers
Ralf.

On Thu, Jun 26, 2008 at 3:14 PM, diehlryan [EMAIL PROTECTED]
mailto:rdiehl%40docfinity.com  wrote:
 I'm running into a wall when trying to use extension with interfaces.
 The example I'm about to provide works using Java, so I believe the
 OOP practices behind it are valid. But I can't figure out how to
 accomplish the same thing in Flex, I keep running into compiler
 issues. The example is a condensed version of something I'm working
 on, for simplicity sake.

 Let's say you have a bunch of events that all have some common
 functionality, like the ability to have a nextEvent. Also, a subset
 of those events also have additional functionality, they can be
 filtered by a type of criteria. We'll call them search events.

 Now, there are some parts of the application that can work with any
 type of search event, and any type of criteria. But when the
 individual searches are executed, that implementation expects a
 specific type of search event and search criteria. That's my end goal
 here.

 Here are the interfaces I'm using:

 public interface ICriteria
 {
 // just a marker
 }

 public interface ICustomCriteria extends ICriteria
 {
 function get name():String;
 function set name(name:String):void;
 }

 public interface IEvent
 {
 function get nextEvent():IEvent;
 function set nextEvent(event:IEvent):void;
 }

 public interface ISearchEvent
 {
 function get criteria():ICriteria;
 function set criteria(criteria:ICriteria):void;
 }

 So far, so good. And now the implementing classes:

 // would like to make this an abstract class, but not supported in AS
 public class BaseEvent implements IEvent
 {
 private var _nextEvent:IEvent;

 public function set nextEvent(event:IEvent):void
 {
 this._nextEvent = event;
 }

 public function get nextEvent():IEvent
 {
 return this._nextEvent;
 }
 }

 // would like to make this an abstract class, but not supported in AS
 public class BaseSearchEvent extends BaseEvent implements ISearchEvent
 {
 private var _criteria:ICriteria;

 public function set criteria(criteria:ICriteria):void
 {
 this._criteria = criteria;
 }

 public function get criteria():ICriteria
 {
 return this._criteria;
 }
 }

 Those base classes are fine and compile correctly. Now if you
 remember from the requirements, there are some places that can work
 with any type of ISearchEvent, and some places that can only work with
 an individual subclass. Here is where the compiler errors come in.
 Doing what I am about to do works in Java, and I'm wondering if there
 is a way to accomplish it in AS3.

 public class CustomSearchEvent extends BaseSearchEvent
 {
 private var _criteria:ICustomCriteria;

 public override function get criteria():ICustomCriteria
 {
 return this._criteria;
 }

 public override function set criteria(criteria:ICustomCriteria):void
 {
 this._criteria = criteria;
 }
 }

 The above class does not compile because the method signatures for
 get/set criteria are different than those specified in the interface.
 But from an OO perspective, I think this is a valid thing to want to
 do. If you're working with an ISearchEvent instance, you should be
 able to subclass the base class and provide custom behavior. The
 ICustomCriteria is a subclass of ICriteria, so you should be able to
 substitute them in this context. Is there another way to accomplish
 this? Or is this just a language feature that's not there?

 

 



RE: [flexcoders] AS3 interface question

2008-06-26 Thread Rick Winscot
By the way. there is an open issue in the Adobe bug-base regarding this.
Vote for it! NOW!

 

http://bugs.adobe.com/jira/browse/ASC-3442

 

Rick Winscot

 

 

From: flexcoders@yahoogroups.com [mailto:[EMAIL PROTECTED] On
Behalf Of Ralf Bokelberg
Sent: Thursday, June 26, 2008 9:22 AM
To: flexcoders@yahoogroups.com
Subject: Re: [flexcoders] AS3 interface question

 

Yep, it's a language feature, which is not there. I think it is called
covariant return types.
Afaik, all you can do is check the type and cast.
Cheers
Ralf.

On Thu, Jun 26, 2008 at 3:14 PM, diehlryan [EMAIL PROTECTED]
mailto:rdiehl%40docfinity.com  wrote:
 I'm running into a wall when trying to use extension with interfaces.
 The example I'm about to provide works using Java, so I believe the
 OOP practices behind it are valid. But I can't figure out how to
 accomplish the same thing in Flex, I keep running into compiler
 issues. The example is a condensed version of something I'm working
 on, for simplicity sake.

 Let's say you have a bunch of events that all have some common
 functionality, like the ability to have a nextEvent. Also, a subset
 of those events also have additional functionality, they can be
 filtered by a type of criteria. We'll call them search events.

 Now, there are some parts of the application that can work with any
 type of search event, and any type of criteria. But when the
 individual searches are executed, that implementation expects a
 specific type of search event and search criteria. That's my end goal
 here.

 Here are the interfaces I'm using:

 public interface ICriteria
 {
 // just a marker
 }

 public interface ICustomCriteria extends ICriteria
 {
 function get name():String;
 function set name(name:String):void;
 }

 public interface IEvent
 {
 function get nextEvent():IEvent;
 function set nextEvent(event:IEvent):void;
 }

 public interface ISearchEvent
 {
 function get criteria():ICriteria;
 function set criteria(criteria:ICriteria):void;
 }

 So far, so good. And now the implementing classes:

 // would like to make this an abstract class, but not supported in AS
 public class BaseEvent implements IEvent
 {
 private var _nextEvent:IEvent;

 public function set nextEvent(event:IEvent):void
 {
 this._nextEvent = event;
 }

 public function get nextEvent():IEvent
 {
 return this._nextEvent;
 }
 }

 // would like to make this an abstract class, but not supported in AS
 public class BaseSearchEvent extends BaseEvent implements ISearchEvent
 {
 private var _criteria:ICriteria;

 public function set criteria(criteria:ICriteria):void
 {
 this._criteria = criteria;
 }

 public function get criteria():ICriteria
 {
 return this._criteria;
 }
 }

 Those base classes are fine and compile correctly. Now if you
 remember from the requirements, there are some places that can work
 with any type of ISearchEvent, and some places that can only work with
 an individual subclass. Here is where the compiler errors come in.
 Doing what I am about to do works in Java, and I'm wondering if there
 is a way to accomplish it in AS3.

 public class CustomSearchEvent extends BaseSearchEvent
 {
 private var _criteria:ICustomCriteria;

 public override function get criteria():ICustomCriteria
 {
 return this._criteria;
 }

 public override function set criteria(criteria:ICustomCriteria):void
 {
 this._criteria = criteria;
 }
 }

 The above class does not compile because the method signatures for
 get/set criteria are different than those specified in the interface.
 But from an OO perspective, I think this is a valid thing to want to
 do. If you're working with an ISearchEvent instance, you should be
 able to subclass the base class and provide custom behavior. The
 ICustomCriteria is a subclass of ICriteria, so you should be able to
 substitute them in this context. Is there another way to accomplish
 this? Or is this just a language feature that's not there?