Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing a generic interface

I have a generic interface:

public interface IUnauthorizedRequestRespondable<out T> where T:class 
{
    T GetResponseForUnauthorizedRequest();
}  

(I'm not sure why Resharper recommended T is "out", but that's not the question).
In my scenario, the object returned by GetResponseForUnauthorizedRequest is always of the type that implements the interface.

So all the interface's implementations look like:

public class SignInReturnedObject : IUnauthorizedRequestRespondable<SignInReturnedObject>  

(class name and the type in brackets are always the same).
Which seems a bit awkward - isn't there a neater way to tell the compiler that the interface's method returns the type it's a part of?

Thanks.

like image 621
Oren A Avatar asked May 05 '26 11:05

Oren A


2 Answers

As far as I know, there is no way to do that currently in C#.

A theoretical side-note: The feature that would allow you to do this is called self types but that's not available in C#. The idea of the feature is that you have a special type that refers to the actual type of this, so if you had a special type named self, you could probably write something like:

public interface IUnauthorizedRequestRespondable { 
    self GetResponseForUnauthorizedRequest(); 
}   

...and the actual type used in place of self when you have a class SignInReturnedObject implementing the interface would be SignInReturnedObject, but unfortunatelly, that's not
available in C# :-)

like image 94
Tomas Petricek Avatar answered May 06 '26 23:05

Tomas Petricek


If the only way you want to use that template is in that manner, I would use:

public interface IUnauthorizedRequestRespondable<T> where T:IUnauthorizedRequestRespondable<T>
{
    T GetResponseForUnauthorizedRequest();
}

This has the advantage of guaranteeing it isn't used in any other way.

The class declaration won't change, but I don't see anything as awkward in this myself. Considering that you are defining a relationship between the class and itself, any more concise form might be inadvisable.

like image 44
Jon Hanna Avatar answered May 07 '26 00:05

Jon Hanna



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!