نقش کلمه کلیدی out در یک اینترفیس جنریک

سوال شده توسط: bzmind ‌

تاریخ ثبت: ۱۴۰۱/۰۱/۱۳

بازدید: 590

پاسخ: 5

تگ: Asp.net Core


سلام استاد اشرافی عزیز،

یه سوال سی شارپی برای من به وجود اومده و باعث شد تا یه تیکه از آموزش ها رو متوجه نشم، اون قسمت که مربوط به نوشتن command handler های MediatR بود (قسمت 61، دقیقه 3:15)، شما گفتید این IBaseCommandHandler یه OperationResult ریترن میکنه، بعد وقتی بریم کد های اصلیه خود MediatR رو ببینیم، یه اینترفیس ساخته که جنریک هست به این صورت زیر،

حالا اینجا من اومدم کد های IRequest رو نوشتم که برای خود MediatR هست:

public interface IRequest<out TResponse> : IBaseRequest

این کلمه out وقتی روی اینترفیس اعمال میشه دقیقا چیکار میکنه؟ مگه اینترفیس هم چیزی میتونه ریترن بکنه، من در مورد این سرچ زدم که تهش رسید به covariance vs contravariance، که متاسفانه چیز زیادی نفهمیدم ازشون، که اصن بدرد چی میخورن،

شما میگفتید این اینترفیس یه operation result ریترن میکنه، چیزی که منو گیج کرده بود همین بود که اینترفیس مگه میشه یچیزی ریترن بکنه،

یه توضیحی اگر بدید در مورد اینا ممنون میشم.

پاسخ ها
user

محمد اشرافی

سلام ببینید Interface قرار نیست چیزی Return کنه این Interface جنریک تعریف شده و متدی که داره از این اینترفیس استفاده میکنه از نوعی که بهش پاس دادیم قراره دیتا رو برگردونه ( پیاده سازیمون باید از اون نوع برگردونه)

وقتی به IRequest میگیم تو جنریکی و TRespons ات از نوع OperationResult ه ، درایم پیاده سازی رو محدود میکنیم که اگر کسی از این اینترفیس ارث بری کنه حتما باید از اون نوع Response بده ، اما توی MediatR از این برای شناسایی Handler ها استفاده میشه ، وقتی قراره Handler هارو پیاده سازی کنید باید حتما یه Type مشخص و درست بهش بدین 

اینترفیس IRequestHandler  از ما یه IRequst میخواد و یه Response که باید حتما یه Command ای که بهش پاس بدیم از نوع IRequest<Response> باشه ( کل کاری که داره انجام میشه اینه که ما رو محدود میکنه که کلاس های الکی پاس ندیم و مطمعن باشیم ورودی و خروجیمون درست ه ) 
 

public interface IRequestHandler<in TRequest, TResponse> where TRequest : IRequest<TResponse>
  {

    /// <returns>Response from the request</returns>
    Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken);
  }

 

برا درک این سه کلمه کلیدی ( in - out - ref ) این مقاله رو ببینید

 

user

bzmind ‌

ممنون بابت توضیح، تا یجایی متوجه شدم.

مقاله رو هم خوندم، نحوه کارکرد اون 3 کلمه کلیدی توی پارامتر های یه متود قابل فهمه ولی نقش این کلمه کلیدی هارو توی پارامتر های یه اینترفیس نمیدونم چیه، مثل این اینترفیس:

public interface IMyInterface<out T>
{
}

اینجا من تاثیر کلمه کلیدی out رو که قبل از T اومده رو نمیدونم چیه، تاثیرش فقط همون بحث covariance و contravariance هست؟

user

محمد اشرافی

بله درسته به همین شکل عمل میکنند

مثال کامل ش رو هم میتونید توی document های ماکروسافت ببینید

out (Generic Modifier)

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/out-generic-modifier

-----------------------

in (Generic Modifier)

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/in-generic-modifier

 

user

bzmind ‌

ممنون استاد،

فقط یه چیزی هست که همینجا بهتون بگم، من وقتی میخواستم سوال رو مطرح کنم، موقع نوشتن سوال، اون ادیتوره اون اینپوت، آپشن اضافه کردن کُد نداشت

همین insert code block که واسه ادیتور هست، ولی اینجا که دارم پاسخ رو مینویسم، این آپشن برای این ادیتور هست، گفتم که اگر خواستید اون ادیتور مربوط به پرسش سوال رو هم درستش کنید، ممنون.

user

محمد اشرافی

ممنون حتما اضافه میکنیم بهش

برای ثبت پاسخ باید خود شوید

محبوب ترین مقالات