tags:

views:

1170

answers:

2

Hi, I'm currently having a problem with a ShoppingCart for my customer.

He wants to be able to add Text between the CartItems so I was wondering if there is some way to still only have one List.

My solution would be to have two lists, one of type IList that gets iterated over when calculating Weight and overall Price of the Cart while having another IList that only exposes the necessary fields for displaying it in the ListView and that is a SuperType of CartItem. (But how do I then access additional fields for the listView, defaulting weight and price to 0 in the Description-Text-Class would break LSP).

But having two lists somehow feels a bit odd (and still gives me problems), so I was wondering if I could do some sort of a TypedList where I specify the Type of each item.

Any suggestions are welcome, I'm not really happy with both options.

+15  A: 

Use an interface:

 ICartListItem

And make your list be:

 List<ICartListItem>

Now, create several types, have all of them implement this interface, and you can store them all safely in your list.

Alternatively, if you want there to be some default logic in a CartItem, use a base class instead of an interface.

FlySwat
Hi,I thought about that Interface approach already. But I thought I would be violating LSP because an CartListItem has additional properties (weight, price) while a TextListItem has only the Text. But that's not so much of an problem now that I think of it.
Tigraine
A: 

The Interface sounds like overkill. I'd just add a property to your current CartItem named something like "TextAfterItem".

Also: make sure your customer understands the cost of this feature in terms of security overhead. It sounds like they think this should be a simple update, but you're allowing users to enter text that will be displayed directly back to the page, and that's a dangerous proposition.

Joel Coehoorn
Reason for downvote?
Joel Coehoorn
Btw, this is no real issue because. It's a windows forms application and my SQL Queries are done through NHibernate, so nothing can get injected to the database and no malicious script could be executed on output.
Tigraine