PDA

مشاهده نسخه کامل : ارث بری در سی شارپ



iranch
25-07-15, 04:32
درود
خوب میدونیم که همه کلاس ها به طور پیش فرض از Object ارث بری می کنند.(به صورت ضمنی)
من یک کلاس می سازم با 100 تا فیلد و 500 تا متد.
حال من می تونم این کلاس رو راحت به Object تبدیل کنم!!
من متوجه نمی شوم چطور میشه؟ در دنیای واقعی مثل این میمونه که ما یک پارچ آب رو بریزیم در یک لیوان آب! آیا جا می شود؟ خیر! سر ریز می شود.
حالا عکس این امکان پذیر هست. یعنی باید بشه Object رو به کلاسی تبدیل کرد که 100 تا فیلد داره و 500 تا متد. مثل این بشه که یک لیوان آب رو بریزیم داخل یک پارچ آب!
که در زبان های برنامه نویسی مثل جاوا و سی شارپ نمیشه!!
اصلا در همان بحث کامپیوتری بحث حافظه Object چگونه هست؟

SajjadKhati
25-07-15, 07:45
من هیچ چی از قضیه ی ارث بری نمیدونم
تازه یه چیزایی از توابع داخل ++C رو تموم کردم و میخام برسم به آرایه ها . بعدشم استراکچر و اشاره گر ها و بعدشم کلاس ها
همه چی رو پیش پیش فهمیده باشم ، اما این کلاس ها رو متوجه نشدم. یکی نیست قشنگ بشکافه شی گرایی و کلاس چیه! :Love-ssa~! (1):

ravegoat
03-08-15, 13:43
با سلام!

کلاس یک مفهوم انتزاعیه که اشیا (Object) بر اساس اون شکل می گیرند. در این تعریف، فرآیند تبدیل کلاس به شی و یا بلعکس اصلا نمی گنجه.
فرض کنید که یه روز در اتاق تون نشسته اید و یک مفهوم میاد در ذهن تون. این مفهوم استوانه ای سفالی رو توصیف می کنه که یک قاعده ی اون بسته و قاعده ی دیگر اون باز هستش و برای اون یک دسته در وجه جانبی در نظر گرفته شده. کاربرد این مفهوم می تونه نوشیدن مایعات باشه. شما نام این مفهوم (Class) رو می ذارید لیوان (mug) . قاعدتا لیوان توصیف شده تا الان یک مفهوم بوده و تا زمانی که یک شی فیزیکی (Object) از اون ساخته نشه، نمیشه ازش برای آشامیدن مایعات استفاده کرد.
حالا شما میایید و مفهوم لیوان رو برای سه تا از دوستانتون به اسم های علی (Ali)، تقی (Taqi) و نقی (Naqi) شرح میدید. فرض می کنیم که هر سه دوست شما مفهوم لیوان (که Class محسوب میشه) رو می پسندند و هر یک مایل هستند یک لیوان واقعی (که Object محسوب میشه) رو داشته باشن. شما هم به اتفاق دوستان تشریف می برید نزد یک سفال گر (نقش کامپایلر رو داره) و با یک زبان (که همون زبان برنامه نویسیه) کلاس لیوان برای او توضیح می دهید تا سفال گر سه شی لیوان رو تولید کنه. در نهایت سه دوست شما می تونند به وسیله ی اشیا تولید شده مایعات رو نوش جان بفرمایند ولی شما همچنان با دونستن مفهوم این اشیا قادر به نوشیدن مایعات توسط اون نیستید.


mug Ali;
mug Taqi;
mug Naqi;



حالا با این تفاسیر آیا تبدیل Object به Class حرف معنی داری هستش؟!

SajjadKhati
25-10-15, 21:45
آقا من یه کم کلاس و شی گرایی رو تو #C پیگیری کردم اما بعضی تیکه هاش رو متوجه نشدم
اول اینکه شی دقیقا به کدوم قسمت میگن؟
مثلا من توی رویداد کلیک یه دکمه میخام از یه کلاس استفاده کنم. مثلا یه خاصیت (متغییر) شو میخام مقدار دهی کنم. توی این رویداد باید بنویسم (به فضای نام و کلاس اون رویداد کاری ندارم) :



using test;

//
//

New Var = new New();
Var.Feature = 10;


بعد توی کلاس که با فضای نام Test و نام کلاس New ساخته شد :



namespace Test
{
class New
{
public int Feature;
}
}


سئوالاتم :
اول اینکه آیا به این متغییر Feature که توی کلاس New ایجاد شد ، میگن فیلد یا اون متغییری که توی قسمت رویداد اون دکمه ، باعث مقدار دهی اش شد؟ احتمالا متغییر داخل کلاس رو باید بگن فیلد؟ درسته؟ همونطور که تابع داخل کلاس رو میگن متد
دوم اینکه توی این کد که میگن آبجکت از کلاس بوجود میاد ، آبجکت به کدوم میگن؟ آیا یه اون متغییر Var که تو رویداد کلیک دکمه نوشته شد میگن آبجکت؟
کلمه ی کلیدی this که اشاره به همون کلاس میکنه ، آیا بجای این کلمه ی کلیدی ، میشه از اسم همون کلاس استتفاده کرد؟
بقیه ی سئوال رو یادم رفت :Love-ssa~! (1):

SajjadKhati
26-10-15, 08:22
بعد اینکه کلاس ها باید توی name space تعریف بشن؟
من دقیق قضیه ی name space رو نفهمیدم . چرا اصلا باید name space ای وجود داشته باشه؟ این تعریفی که میگم درسته از name space؟ اینکه مثل کلاس ها که توابع و متدها توش دسته بندی میشن ، name space هم باعث دسته بندی کلاس ها میشه و انواع کلاس ها رو میشه توش قرار داد. درسته؟

SajjadKhati
26-10-15, 10:06
کسی نیست جواب بده؟
کلمه ی new دقیقا برای چی هه؟ مثلا چرا باید موقع فراخونی یه کلاس یا ایجاد یه آرایه از new استفاده کرد اما مثلا موقع تعریف متغییر نه؟
نوع آرگومان eventargs ها دقیقا چی ان توی متدهایی که برای رویداد مثلا رویداد click برای کنترل یه دکمه تعریف میشن؟ کارکردش مثل متد extention هست؟ کلا یه کم از کارکردش میخام بدونم

SajjadKhati
26-10-15, 19:54
درباره ی فضای نام ها و متدهای مایکروسافت (مثلا فضای نام و متدهای مربوط به مدیریت فایل و یا مدیریت آهنگ و ...) که به کار آدم میاد بگین چجوری باید گیرشون بیاریم؟ طبعا نمیشه این فضای نام و متدها رو حفظ کرد . حداقل ما مبتدی ها نمیتونیم حفظ کنیم (سایتی چیزی)

ravegoat
31-10-15, 11:09
...
سئوالاتم :
اول اینکه آیا به این متغییر Feature که توی کلاس New ایجاد شد ، میگن فیلد یا اون متغییری که توی قسمت رویداد اون دکمه ، باعث مقدار دهی اش شد؟ احتمالا متغییر داخل کلاس رو باید بگن فیلد؟ درسته؟ همونطور که تابع داخل کلاس رو میگن متد

دوم اینکه توی این کد که میگن آبجکت از کلاس بوجود میاد ، آبجکت به کدوم میگن؟ آیا یه اون متغییر Var که تو رویداد کلیک دکمه نوشته شد میگن آبجکت؟

کلمه ی کلیدی this که اشاره به همون کلاس میکنه ، آیا بجای این کلمه ی کلیدی ، میشه از اسم همون کلاس استتفاده کرد؟
بقیه ی سئوال رو یادم رفت :Love-ssa~! (1):



همون که طور که خودت حدس زدی به متغییر Feature که توی کلاس New ایجاد شد میگن فیلد.
همون طور که که خودت حدس زدی به اون متغییر Var که تو رویداد کلیک دکمه نوشته شد میگن آبجکت.
نه نمیشه.

ravegoat
31-10-15, 11:14
بعد اینکه کلاس ها باید توی name space تعریف بشن؟

من دقیق قضیه ی name space رو نفهمیدم . چرا اصلا باید name space ای وجود داشته باشه؟ این تعریفی که میگم درسته از name space؟ اینکه مثل کلاس ها که توابع و متدها توش دسته بندی میشن ، name space هم باعث دسته بندی کلاس ها میشه و انواع کلاس ها رو میشه توش قرار داد. درسته؟

نه الزاما. تعریف کلاس بیرون فضای نام هم ممکنه. البته در برخی از انواع پروژه نظیر Windows Form این کار شاید مشکل ساز بشه.

تعریفی که از فضای نام ارایه کردی درسته. فضای نام به کد سر و سامان می بخشه.

SajjadKhati
31-10-15, 11:34
ممنون گلپسر آرمین
یه سئوال دیگه دارم
Unmanaged Exports در #C چیه؟
چجوری میتونم کدهامو به این روش خروجی بگیرم؟
من مبتدی هستم ها
:give_rose:

ravegoat
31-10-15, 13:58
کلمه ی new دقیقا برای چی هه؟ مثلا چرا باید موقع فراخونی یه کلاس یا ایجاد یه آرایه از new استفاده کرد اما مثلا موقع تعریف متغییر نه؟

کلا برای تعریف یک شی از کلاس باید از کلمه کلیدی new استفاده کرده. کلاس هایی از نوع Primitive Types (Only the registered members can see the link) از این قاعده مستثنی هستن. چون این نوع متغیر ها فقط داخل خودشون مقداری رو ذخیره می کنن، بدون new میشه تعریف شون کرد. اما تا زمانی که مقدار دهی نشوند، نمیشه ازشون در ادامه ی کد استفاده کرد. مثلا":


int a = 0;




برخی از این متغیر ها تحت عنوان Value Types (Only the registered members can see the link) اگر با new تعریف بشن، مقادیر پیش فرضی به خود می گیرن. مثلا":

int a = new int();

که باعث میشه با تعریف a مقدارش برابر صفر بشه.

نکته ی جالب اینجاست که شما برای تعریف int به new نیاز ندارید ولی برای تعریف آرایه ای از int ها که یک شی جدید محسوب میشه باید از new استفاده کنید:

int[] arr1 = new int[] { 3, 4, 5 };


در کل اگر ما بخواهیم یک متغیر از نوع Bitmap تعریف کنیم نمی تونیم فقط بهش یه مقدار بدیم. در نتیجه با کلمه کلیدی new تعیین می کنیم که این متغیر چقدر طول داره، چقدر عرض داره، پیکسل هاش چند بیتی هستن و غیره. برای اطلاعات بیش تر:
Only the registered members can see the link
Only the registered members can see the link


نوع آرگومان eventargs ها دقیقا چی ان توی متدهایی که برای رویداد مثلا رویداد click برای کنترل یه دکمه تعریف میشن؟ کارکردش مثل متد extention هست؟ کلا یه کم از کارکردش میخام بدونم

EnventArgs شامل پارامتر هایی از رویداد رخ داده شده است. مثلا e از نوع EventArgs در رویداد MouseClick شامل مختصات x و y محل کلیک شدن ماوس خواهد بود.

ravegoat
31-10-15, 14:03
درباره ی فضای نام ها و متدهای مایکروسافت (مثلا فضای نام و متدهای مربوط به مدیریت فایل و یا مدیریت آهنگ و ...) که به کار آدم میاد بگین چجوری باید گیرشون بیاریم؟ طبعا نمیشه این فضای نام و متدها رو حفظ کرد . حداقل ما مبتدی ها نمیتونیم حفظ کنیم (سایتی چیزی)

سجاد جان: MSDN (Only the registered members can see the link)

ravegoat
31-10-15, 14:37
ممنون گلپسر آرمین
یه سئوال دیگه دارم
Unmanaged Exports در #C چیه؟
چجوری میتونم کدهامو به این روش خروجی بگیرم؟
من مبتدی هستم ها
:give_rose:
خواهش می کنم.
کد ها به طور پیش فرض در سی شارپ Managed هستن و ابتدا به CLR تبدیل میشن و سپس از طریق .NET Framework به زبان ماشین ترجمه میشن. این طوری مدیریت حافظه بهتر و اجرای کد های خطرناک محدود تر خواهد شد. ولی از طرفی سرعت اجرا کم تر میشه و برای اجرای برنامه در هر سیستم عاملی، دات نت فریم ورک نیازه.
در حالی که در کد Unmanaged برنامه مستقیما به زبان ماشین تبدیل میشه. در این صورت نیازی به دات نت فریم ورک نخواهد بود.
برای گرفتن چنین خروجی ای از سورس تون به پیوند زیر مراجعه کنید:
Only the registered members can see the link

SajjadKhati
31-10-15, 15:49
خواهش می کنم.
کد ها به طور پیش فرض در سی شارپ Managed هستن و ابتدا به CLR تبدیل میشن و سپس از طریق .NET Framework به زبان ماشین ترجمه میشن. این طوری مدیریت حافظه بهتر و اجرای کد های خطرناک محدود تر خواهد شد. ولی از طرفی سرعت اجرا کم تر میشه و برای اجرای برنامه در هر سیستم عاملی، دات نت فریم ورک نیازه.
در حالی که در کد Unmanaged برنامه مستقیما به زبان ماشین تبدیل میشه. در این صورت نیازی به دات نت فریم ورک نخواهد بود.
برای گرفتن چنین خروجی ای از سورس تون به پیوند زیر مراجعه کنید:
Only the registered members can see the link

ممنون گلپسر
من همین کد رو زدم اما ارور میده
یه فایلی نیست که دانلود بشه و درست بشه؟
واقعیت اینه که من میخام از فایل dll ساخته شده در #C ، توی نرم افزار اتوپلی مدیا استودیو فراخوانی کنم اما اتوپلی فقط میتونه تابع رو فراخوانی کنه در صورتی که توی #C باید کد رو در قالب کلاس تعریف کرد
بهم گفتن که مشکل این اتوماتیک با Unmanaged Exports حل میشه . روش کار کردم اما گفتم که ارور داد

ravegoat
01-11-15, 08:04
ممنون گلپسر
من همین کد رو زدم اما ارور میده
یه فایلی نیست که دانلود بشه و درست بشه؟
واقعیت اینه که من میخام از فایل dll ساخته شده در #C ، توی نرم افزار اتوپلی مدیا استودیو فراخوانی کنم اما اتوپلی فقط میتونه تابع رو فراخوانی کنه در صورتی که توی #C باید کد رو در قالب کلاس تعریف کرد
بهم گفتن که مشکل این اتوماتیک با Unmanaged Exports حل میشه . روش کار کردم اما گفتم که ارور داد

ُسجاد جان خطاش چیه؟

منظورت چیه از این که یک فایلی دانلود و درست بشه؟

این که اتوپلی فقط تابع رو می خونه برام واضح نیست. میشه بیش تر توضیح بدی؟

در کل خروجی گرفتن به این روش ممکنه خیلی خطا بده. این دو تا پیوند رو هم یه نگاهی بهشون بنداز:
Only the registered members can see the link
NuGet Docs (Only the registered members can see the link)

شاد و موفق باشی
آرمین:11():

SajjadKhati
01-11-15, 08:22
ممنون گلپسر
از همون لینکه رفتم و کد Install-Package UnmanagedExports رو زدم و همینطور که تو عکس مشخصه ، پیام موفقیت آمیز رو داد
اما همونطور که بازم توی عکس مشخصه ، توی خط زرد رنگ نوشته که انگار نمیشه از توی این پروژه از تابع استفاده کرد!
از الان باید چجوری بصورت Unmanaged Exports پروژه درست کنم؟
فقط تابع رو میتونه باهاش ارتباط برقرار کنه مثل پروژه های ++C یا ویژال بیسیک که بصورت تابع نوشته میشن (بصورت کلاس شون نه) اما توی #C حتما باید کلاسی باشه تا تابع یا متد توش قرار بگیره که اتوپلی نمیتونه کلاس رو فراخونی کنه

Only the registered members can see the link

ravegoat
01-11-15, 14:31
خواهش می کنم سجاد جان...

بی زحمت پلتفرم کامپایلت رو از Any Cpu به x86 یا x64 تغییر بده، شاید مشکل حل بشه. روند انجامش در زیر اومده:
Only the registered members can see the link

در سی شارپ توابع داخل کلاس رو به صورت static تعریف کن، بعد بررسی کن که آیا ساختارش مثل C++ و VB6 میشه داخل اتوپلی یا خیر؟

موفق باشی
آرمین

SajjadKhati
01-11-15, 23:33
خواهش می کنم سجاد جان...

بی زحمت پلتفرم کامپایلت رو از Any Cpu به x86 یا x64 تغییر بده، شاید مشکل حل بشه. روند انجامش در زیر اومده:
Only the registered members can see the link

در سی شارپ توابع داخل کلاس رو به صورت static تعریف کن، بعد بررسی کن که آیا ساختارش مثل C++ و VB6 میشه داخل اتوپلی یا خیر؟

موفق باشی
آرمین

یکی گفت علاوه بر اینا ، AMS با دات نت فریم ورذک 2 یا 3 کار میکنه
روی دات نت 3 گذاشتم و روی x64 گذاشتم اما ارور زیر میده :

Only the registered members can see the link

ravegoat
02-11-15, 08:32
یکی گفت علاوه بر اینا ، AMS با دات نت فریم ورذک 2 یا 3 کار میکنه
روی دات نت 3 گذاشتم و روی x64 گذاشتم اما ارور زیر میده :

Only the registered members can see the link
سجاد جان target هر دو پروژه ی ClassLibrary1 و WindowsFormApplication1 باید عین هم باشه. اگه این طوره، هر دو پروژه رو روی پلتفرم 32 بیتی بذار و مجدد امتحان کن.

SajjadKhati
10-11-15, 11:39
ممنون اوستا آرمین
آقا من توی پروژه ی dll ای که بصورت unmanaged درست کردم با X86 (ویندوز من ولی X64 هه . ربطی به این داره؟) ، یک کلاس و ... نوشتم :



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.Text;
using System.IO;


namespace ClassLibrary1
{
public class Class1
{
public Class1()
{

}


public static void DelNew(string b)
{
File.Delete(b);
}


}
}


توی یه پروژه ی دیگه (پروژه ی Form دار) لود میکنم که اینم Unmanaged هست و هر دو X86 ، و ازش شی میسازم به شرح زیر :



Class1 FileDel = new Class1();


تابع یا متد DelNew رو نمیتونه بشناسه . یعنی مینویسم FileDel بعدش نقطه که میزارم ، DelNew رو توی لیست نمیاره . چرا؟
حتی اون متد DelNew رو بصورت static تعریف کردم که بدون ایجاد شی هم باید فراخونی میشد که این جوری هم نمیشه!
یه کم سریع تر جواب میدین؟