2017-01-26 4 views
0

Ich lerne gerade C# und komme aus Java. In Java kann ich so etwas tun:Klassen, die durch Generika miteinander verbunden sind

public interface BasePresenterView<T extends BaseActivityPresenter> {} 
public interface BaseActivityPresenter<T extends BasePresenterView> {} 

und in C# Ich habe eine harte Zeit, die gleiche Sache zu erreichen.

+0

Sie haben Circular-Abhängigkeit: BasePresenterView ist generisch mit dem Parameter BaseActivityPresenter und BaseActivityPresenter ist generisch mit dem Parameter BasePresenterView. Ich denke nicht, dass es wirklich möglich ist –

+0

Jeez, erste Stunden mit der Sprache und ich hämmere schon meinen Kopf gegen die Wand. Nicht gut:/ – dgomolka

+0

In .Net ist es Konvention, alle Schnittstellen mit einem vorangestellten Großbuchstaben 'I' zu versehen und meistens das Wort' Base' für abstrakte Klassen zu reservieren. –

Antwort

0

Ich glaube, ich es gelöst :)

public interface BaseActivityPresenter<T, K> 
     where T : BasePresenterView<T, K> 
     where K : BaseActivityPresenter<T, K> {} 

public interface BasePresenterView<T, K> 
     where T : BasePresenterView<T, K> 
     where K : BaseActivityPresenter<T, K> {} 

, dass die Arbeit ... für jetzt zu sein scheint. Ich weiß nicht, ob das ein richtiger Ansatz ist.

+0

während es nicht viel ausmacht ... Ich würde vorschlagen, Sie tun '' gegenüber '' –

+0

@MatthewWhited ja, das ist ein weiser Vorschlag, ich werde das tun. Vielen Dank :) – dgomolka

0

Dies wird in .NET als generische Einschränkung bezeichnet.

Ihr Beispiel in C# wird so aussehen.

public interface BasePresenterView<T> where T: 'Interface or Type'{} 
public interface BaseActivityPresenter<T> where T: 'Interface or Type' {} 

Mehr Informationen: https://msdn.microsoft.com/en-us/library/d5x73970.aspx

EDIT: Wie bereits erwähnt zirkuläre Abhängigkeiten sind nicht möglich in C#, so dass Sie sie nicht in der gleichen Weise wie in Ihrem Beispiel Einschränkung kann.

0

Sie können generic type constraints verwenden, die Kompilierungszeittypen durch Vererbung einschränken.

Da Vererbung nicht zirkulär sein kann, können Sie nicht die zirkuläre Abhängigkeit wie in der Frage haben.

Allerdings, wenn sie die gleichen Methoden oder Eigenschaften erklären, könnten sie die gleiche Schnittstelle erben:

public interface BasePresenterView  : IBaseView 
public interface BaseActivityPresenter : IBaseView 
0

Sie wollen so etwas wie dieses, wenn Sie abstrakte Basisklassen verwenden ...

public abstract class MyBasePresenter 
{ 
} 
public abstract class MyBasePresenter<TView> : MyBasePresenter 
    where TView : MyBaseView 
{ 
} 

public abstract class MyBaseView 
{ 
} 
public abstract class MyBaseView<TPresenter> : MyBaseView 
    where TPresenter : MyBasePresenter 
{ 
} 

public class MyView : MyBaseView<MyPresenter> 
{ 
} 
public class MyPresenter : MyBasePresenter<MyView> 
{ 
} 

... dies tun, wenn Sie Schnittstellen wollen ...

public interface IMyPresenter 
{ 
} 
public interface IMyPresenter<TView> : IMyPresenter 
    where TView : IMyView 
{ 
} 

public interface IMyView 
{ 
} 
public interface IMyView<TPresenter> : IMyView 
    where TPresenter : IMyPresenter 
{ 
} 

public class MyView : IMyView<MyPresenter> 
{ 
}  
public class MyPresenter : IMyPresenter<MyView> 
{ 
} 

... von euch wirklich verrückt gehen wollen Sie sogar nisten die Generika ...

public class MyView : IMyView<IMyPresenter<IMyView>> 
{ 
} 
Verwandte Themen