Hi Wolfgang,
Try this:
public interface IItemPersistor
{
void Save(object item);
}
public interface IItemPersistor<T> : IItemPersistor
{
new void Save(T item);
}
class PersonPersistor : IItemPersistor<Person>
{
public void Save(Person item)
{
//Implementation of saving of Person
}
void IItemPersistor.Save(object item)
{
var person = item as Person;
if (person != null)
{
this.Save(person);
}
else
// You choose: Do nothing, Log, Throw an
exception?
}
}
Let me know how that goes.
Now I would be inclined not to call `Save` on the `IItemPersistor` interface
if you knew you were saving a `Person` object. I'd cast to the
`IItemPersistor<Person>` interface first. If you don't know that the object
you have is a `Person` object then I'd really question whether the rest of
your object model is correct. Perhaps you could show me more of the calling
code?
Cheers.
James.
From: [email protected] [mailto:[email protected]]
On Behalf Of Wolfgang Von Steinberg
Sent: Sunday, 7 November 2010 18:11
To: ozDotNet
Subject: Re: Generic Interface Question (.net 4.0)
Hi James,
Thank you for your response, I am not fussed about what to use as long as I
can get it working. This is what I have got so far:
public interface IItemPersisor
{
void Save(object item);
}
public interface IItemPersisor<T> : IItemPersisor
{
void Save(T item);
}
but now in implementation I implement Save twice :
class PersonPersistor : IItemPersisor<Person>
{
void IItemPersisor<Person>.Save(Person item)
{
//Implementation of saving of Person
}
void IItemPersisor.Save(object item)
{
(this as IItemPersisor<Person>).Save(item as Person); //<--Warning
Upcasting is this ok??
}
}
Is Upcasting like above OK? or should I use some other method?,
if you know of a book or reference I should look up please let me know, I'll
chase it up myself and stop wasting your time.
Thanks
WVS
On Sun, Nov 7, 2010 at 5:54 PM, James Chapman-Smith <[email protected]>
wrote:
Hi Wolfgang,
The simplest approach, which also works in 3.5, is to create an IPersistor
interface that IPersistor<T> inherits from. Then you can assign any
IPersistor<T> to a variable of IPersistor.
In 4.0 though, you can now use co-variance or contravariance (not both) when
designing your interface. So if you have only "in" parameters of type T you
can define the IPersistor<T> interface as IPersistor<in T> which would allow
you to assign IPersistor<B> to IPersistor<C> provided that C inherits from
B. If you only have "out" parameters ie return types of T then you can
define IPersistor<T> as IPersistor<out T> which would allow you to assign
IPersistor<B> to IPersistor<A> provided that B inherits from A.
It's this latter case that would allow you to assign persistors to
IPersistor<object>, but I suspect that the interface is not an "out"
interface. If that's correct you need to stick to the 3.5 functionality.
Cheers.
James.
From: [email protected] [mailto:[email protected]]
On Behalf Of Wolfgang Von Steinberg
Sent: Sunday, 7 November 2010 16:01
To: [email protected]
Subject: Generic Interface Question (.net 4.0)
Hello
I am using .net 4.0
I have :
IPersistor<T>
and
class CausePersistor implementing IPersistor<Cause>
class PersonPersistor implementing IPersistor<Person>
now, how can I have something like :
IPersistor persistor; where I could assign an object that implements either
IPersistor<Cause> , IPersistor<Person> ?
In other words what is the abstraction to be used for IPersistor<object> ?
I already tried
IPersistor<object> persistor = new CausePersistor(); but this doesn't
compile.
Thank you
WVS