Interface
- Hi
I have 2 base interfaces, IViewBase (which all views will implement) and IPresenterBase (which all presenters will implement):
public interface IViewBase { }
public interface IPresenterBase
{
IViewBase View { get; set; }
}
Then i've created a new interface ILogPresenter that derives from IPresenterBase and ILogView deriving from IViewBase:
public interface ILogPresenter : IPresenterBase { }
public interface ILogView : IViewBase{ }
When i create a class that implements ILogPresenter,
public class LogPresenter: ILogPresenter
{
public ILogView View { get; set; }
}
I get an error:
'LogPresenter' does not implement interface member 'IPresenterBase.View'. 'LogPresenter.View' cannot implement 'IPresenterBase.View' because it does not have the matching return type of 'Views.IViewBase'.
I cannot set the return type of LogPresenter.View to ILogView which derives from IViewBase? How should i go on with derived interface presenters with derived interface views?
Answers
- Then you would need to create a generic base interface like this:
#region Views public interface IViewBase { } public interface ILogView : IViewBase{ } #endregion #region Presenters public interface IPresenterBase<T> where T : IViewBase { T View { get; set; } } public interface ILogPresenter : IPresenterBase<ILogView> { } #endregion #region Implementation public class LogPresenter : ILogPresenter { public ILogView View { get; set; } } #endregion
Geert van Horrik - CatenaLogic
Visit my blog: http://blog.catenalogic.com
Looking for a way to deploy your updates to all your clients? Try Updater!- Marked As Answer byeryangMSFT, ModeratorWednesday, November 11, 2009 9:33 AM
- If you want something like:
LogPresenter<ISpreadsheetView> logPresenter = new LogPresenter<ISpreadsheetView>(); IViewBase viewBase = logPresenter.View;
you could modify Geert's code like this:
#region Views public interface IViewBase { } public interface ILogView : IViewBase { } public interface ISpreadsheetView : IViewBase { } #endregion #region Presenters public interface IPresenterBase<T> : IViewBase { T View { get; set; } } public interface ILogPresenter<T> : IPresenterBase<T> where T : IViewBase { } #endregion #region Implementation public class LogPresenter<T> : ILogPresenter<T> where T : IViewBase { public T View { get; set; } } #endregion- Proposed As Answer byGeert van Horrik Wednesday, November 04, 2009 12:33 PM
- Marked As Answer byeryangMSFT, ModeratorWednesday, November 11, 2009 9:33 AM
All Replies
- Try this:
public class LogPresenter: ILogPresenter { public IViewBase View { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } }
Marcel - Your definition of the property View in the LogPresenter class is incorrect. Should be:
public IViewBase View { get; set; }
Since that is how the IPresenterBase interface is declared.
Geert van Horrik - CatenaLogic
Visit my blog: http://blog.catenalogic.com
Looking for a way to deploy your updates to all your clients? Try Updater! Well that works but my main question would be: i would like to implement ILogPresenter with a different IView which derives from IViewBase.
- Then you would need to create a generic base interface like this:
#region Views public interface IViewBase { } public interface ILogView : IViewBase{ } #endregion #region Presenters public interface IPresenterBase<T> where T : IViewBase { T View { get; set; } } public interface ILogPresenter : IPresenterBase<ILogView> { } #endregion #region Implementation public class LogPresenter : ILogPresenter { public ILogView View { get; set; } } #endregion
Geert van Horrik - CatenaLogic
Visit my blog: http://blog.catenalogic.com
Looking for a way to deploy your updates to all your clients? Try Updater!- Marked As Answer byeryangMSFT, ModeratorWednesday, November 11, 2009 9:33 AM
- If you want something like:
LogPresenter<ISpreadsheetView> logPresenter = new LogPresenter<ISpreadsheetView>(); IViewBase viewBase = logPresenter.View;
you could modify Geert's code like this:
#region Views public interface IViewBase { } public interface ILogView : IViewBase { } public interface ISpreadsheetView : IViewBase { } #endregion #region Presenters public interface IPresenterBase<T> : IViewBase { T View { get; set; } } public interface ILogPresenter<T> : IPresenterBase<T> where T : IViewBase { } #endregion #region Implementation public class LogPresenter<T> : ILogPresenter<T> where T : IViewBase { public T View { get; set; } } #endregion- Proposed As Answer byGeert van Horrik Wednesday, November 04, 2009 12:33 PM
- Marked As Answer byeryangMSFT, ModeratorWednesday, November 11, 2009 9:33 AM
- Thanks for the prompt answers. The above question is related to composite wpf (prism).
If anyone has experience with prism, please help me solve this:
http://compositewpf.codeplex.com/WorkItem/View.aspx?WorkItemId=5414 - Your question is answered. Please wait for a reply in the prism forums (but I guess you need to use a class instead of an interface to construct, simply because interfaces cannot be constructed).
In other words, create a class like this:
public class MyPresenter : IPresenterBase<IViewBase>> { }
And construct the type MyPresenter (which will succeed).
Geert van Horrik - CatenaLogic
Visit my blog: http://blog.catenalogic.com
Looking for a way to deploy your updates to all your clients? Try Updater! Putting composite wpf aside. I'm working on an example base on your code above:
#region Views
public interface IViewBase { }public interface ILogView : IViewBase{ }
#endregion#region Presenters
public interface IPresenterBase<T> where T : IViewBase
{
T View { get; set; }
}public interface ILogPresenter : IPresenterBase<ILogView>
{
}
#endregion#region Implementation
public class LogPresenter : ILogPresenter
{
public ILogView View { get; set; }
}
#endregion
How could i instantiate a class of type "LogPresenter" when i want to use "IPresenterBase<IViewBase>" as the variable type? e.g.
IPresenterBase<IViewBase> presenter = ?;
Edit:
The base idea:
public interface IPresenterBase
{
object View { get; set; }
}public interface ILogPresenter : IPresenterBase { }
public class LogPresenter : ILogPresenter
{
public object View { get; set; }
}class Program
{
static void Main(string[] args)
{
IPresenterBase logPresenter = new LogPresenter();
Console.WriteLine(logPresenter.View.ToString());
}
}
Now add generic concept in this base idea and instead of view having type of object make it generic.Can anyone help here? Is this even possible?
- I'm afraid, I don't understand ... What keeps you from writing (s. my example above):
IPresenterBase<IViewBase> logPresenter = new LogPresenter<IViewBase>(); - What's the point of an interface being generic, if the final class is not...
To get the typed value, you need to do this:
IPresenterBase<IViewBase> presenter = LogPresenter();
However, you can never change the IViewBase type because the LogPresenter only implements the IViewBase. If you want a really generic class (and thus interface), use this:
// I don't see the point of this interface, but you probably have your reasons to create it public interface ILogPresenter<T> : IPresenterBase<T> {} public class LogPresenter<T> : ILogPresenter<T> { public T View { get; set; } }
Now, if you create your log presenter like this:
ILogPresenter<MyView> logPresenter = new LogPresenter<MyView>();
or
ILogPresenter<AnotherView> logPresenter = new LogPresenter<AnotherView>();
Geert van Horrik - CatenaLogic
Visit my blog: http://blog.catenalogic.com
Looking for a way to deploy your updates to all your clients? Try Updater! - Well the final class is "indirectly" generic in the above example due to it implementing the ILogPresenter which sets the view type.
Both solutions are fine with me, it think it both goes to the direction of solving my problem.
What i found so far, which works:
ILogPresenter<IViewBase> presenter1 = new LogPresenter<IViewBase>();
IPresenterBase<IViewBase> presenter = presenter1;
or
IPresenterBase<IViewBase> presenter2 = new LogPresenter<IViewBase>();
What i don't get (which is the final solution i'm looking for but found out that its not possible)
ILogPresenter<ILogView> presenter1 = new LogPresenter<ILogView>();
IPresenterBase<IViewBase> presenter = presenter1;
or
IPresenterBase<IViewBase> presenter2 = new LogPresenter<ILogView>();
Not possible even though ILogView derives from IViewBase...


