نمایش نتایج 1 تا 11 از 11

نام تاپیک: چرا نمیشه یه همچین interface رو طراحی کرد؟

  1. #1

    چرا نمیشه یه همچین interface رو طراحی کرد؟

    کد زیر را در نظر بگیرید:

    Isum = interface
    ['{66C1649F-9281-4B5A-A558-734A40971403}']
    function Add :pointer;virtual;
    end;

    و بعد کلاس هایی که هر کدوم پیاده سازی خاص Isum را انجام می دن:

    این :

    SumClass1=class(TInterfacedObject,Isum)
    function Add(x,y:integer):integer;overload;

    و این:
    [/code]
    SumClass2=class(TInterfacedObject,Isum)
    function Add(x,y:real):real;overload;
    [/code]
    مشکل اینجاست که همچین تعریفی در دلفی مجاز نیست و من حتما یه چنین پیاده سازی رو می خوام.
    در ضمن در خود interface Isum از وجود کلمه virtual خطا میگیره.
    چه باید کرد؟

  2. #2
    در ضمن در خود interface Isum از وجود کلمه virtual خطا میگیره.
    استفاده از متد virtual در Interface بی معنی هست!

    مشکل اینجاست که همچین تعریفی در دلفی مجاز نیست و من حتما یه چنین پیاده سازی رو می خوام.
    متد Add در کد زیر توسط IMyInterface تعریف شده و توسط TMyClass1 (برای نوع string) و TMyClass2(نوع integer) پیاده سازی شده. تعداد پارامترهای ورودی و نوع آنها و نوع پارامتر خروجی نامشخص هست:

    interface

    type
    IMyInterface = interface
    procedure Add(Args: array of const; var Output: variant);
    end;

    TMyClass1 = class(TInterfacedObject,IMyInterface)
    //Aggrigate some string variables
    procedure Add(Data: array of const; var Output: variant);
    end;

    TMyClass2 = class(TInterfacedObject,IMyInterface)
    //Add some integer numbers
    procedure Add(Data: array of const; var Output: variant);
    end;

    implementation

    { TMyClass1 }
    procedure TMyClass1.Add(Data: array of const; var Output: variant);
    var
    i : integer;
    begin
    try
    for i := 0 to High(Data) do
    case Data[i].VType of
    vtAnsiString : Output := Output + string(Data[i].vAnsiString);
    vtChar : Output := Output + Data[i].VChar;
    end; //case
    except
    Output := '';
    end;
    end;

    { TMyClass2 }
    procedure TMyClass2.Add(Data: array of const; var Output: variant);
    var
    i : integer;
    begin
    try
    for i := 0 to High(Data) do
    Output := Output + Data[i].VInteger;
    except
    Output := -1;
    end;
    end;


    مثال:

    procedure TForm1.Button1Click(Sender: TObject);
    var
    Output : variant;
    MyClass1 : IMyInterface;
    begin
    MyClass1 := TMyClass1.Create;
    MyClass1.Add(['a','b','cj','0'],Output );
    ShowMessage(Output);
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var
    Output : variant;
    MyClass2 : IMyInterface;
    begin
    MyClass2 := TMyClass2.Create;
    MyClass2.Add([1,2,3,4,5],Output);
    ShowMessage(IntToStr(integer(Output&#4 1;));
    end;


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  3. #3

    رذ

    اقای کشاورز سپاسگزارم.
    این واقعا همون چیزی بود که می خواستم. :D :D :D

  4. #4

    <<<<VReal>>>> نیست

    یک مشکل :دلفی vreal نداره
    چطوری میشه عمل جمع اعداد اعشاری رو پیدا سازی کرد
    من کد بالا رو میخوام برای اعداد اعشاری توسعه بدم
    ولی یه چیزی مثل &lt;&lt;&lt;&lt;VReal>>>>نیاز که دلفی اونو نداره !
    حالا باید چکار کرد؟؟؟

  5. #5

    رذ

    چرا از IMyInterface یک شی ساخته شده:

    MyClass2 &#58; IMyInterface;

  6. #6
    یک مشکل :دلفی vreal نداره
    می تونید از vExtended یا vCurrency استفاده کنید. البته حافظه بیشتری از real استفاده می کنند.

    چرا از IMyInterface یک شی ساخته شده:
    اینطوری می تونید از قابلیت refrence-counting اون interface استفاده کنید. یعنی بعد از اینکه کارتون با شی مورد نظر تموم شد، لازم نیست اونو free کنید. در صورتی که ارجاعی (refrence) به اون وجود نداشته باشه، بطور اتوماتیک پاک سازی میشه.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  7. #7

    fg

    من متوجه نمیشم در اینجا واقعا چه اتفاقی داره میفته؟؟

    MyClass2 &#58; IMyInterface;
    begin
    MyClass2 &#58;= TMyClass2.Create;
    MyClass2.Add&#40;&#91;1,2,3,4,5&#93;,Output&#41;;
    ShowMessage&#40;IntToStr&#40;integer&#40;Output&#4 1;&#41;&#41;;

    متغیری از نوع IMyInterface تعریف میشه و بعد از کلاس TMyClass2 یک instance ساخته میشه

  8. #8
    من مستندات دلفی رو بررسی کردم ولی در مورد VInteger و VChar پیدا نکردم
    توضیحات بیشتر رو از کجا میشه گیر اورد؟

  9. #9
    مشکل:من نمی دونم چرا این تیدیل رو run time error می ده؟

    for i &#58;= 0 to High&#40;Data&#41; do
    result &#58;= result + Data&#91;i&#93;.vcurrency;

    حتی نوع vextended رو هم امتحان کردم باز مشکل داره
    البته من فکر میکنم Data[i].vcurrency یک اشاره گر باشه.
    مشکل چیه؟و چه باید کرد؟

  10. #10
    حتی نوع vextended رو هم امتحان کردم باز مشکل داره
    البته من فکر میکنم Data[i].vcurrency یک اشاره گر باشه.
    مشکل چیه؟و چه باید کرد؟
    باید به اینصورت بنویسید:

    result &#58;= result + Data&#91;i&#93;.VExtended^;

    در ضمن در این حالت داده های ورودی شما باید حتما از نوع اعداد اعشاری یاشند و در صورتی که از اعداد صحیح استفاده کنید، با خطا مواجه میشید. اگر لازم هست که اعداد صحیح و اعشاری با هم استفاده بشند، باید نوع هر ورودی رو با استفاده از Data[i].VType بدست بیارید (همون کاری که در کد بالا برای نوع string و char انجام دادم).

    متغیری از نوع IMyInterface تعریف میشه و بعد از کلاس TMyClass2 یک instance ساخته میشه
    وقتی متغیری از یک interface تعریف می کنید (IMyInterface)، می تونید از این متغیر برای ایجاد نمونه هایی (Instances) از کلاس هایی که اون Interface رو پیاده سازی کرده اند (TMyClass1 و TMyClass2) استفاده کنید. در این صورت اینترفیس مربوطه بصورت اتوماتیک نمونه ایی از کلاس مورد نظر رو ایجاد میکنه:

    var
    MyClass2 &#58; IMyInterface;
    begin
    MyClass2 &#58;= TMyClass2.Create;

    در کد بالا، هر چند شما نمونه ایی از TMyClass2 بوجود نیاوردید، اما این نمونه بصورت خودکار توسط اینترفیس IMyInterface برای شما ساخته خواهد شد و یک واحد به TMyClass2.RefCount اضافه میشه (RefCount در کلاس TInterfacedObject تعریف شده).
    در هنگامی که متغیر مربوطه (در اینجا MyClass2) از محدوده دید (Scope) خارج بشه (در اینجا با خارج شدن از متد Button2Click )، یک واحد از RefCount کم میشه. اگر مقدار RefCount به صفر برسه، شئی اختصاص داده شده به اینترفیس بصورت خودکار توسط اینترفیس پاک سازی میشه و نیازی به فراخوانی متد Free نیست (به این قابلیت Reference-counting گفته میشه).


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  11. #11
    با تشکر

تاپیک های مشابه

  1. طراحی interface سه بعدی
    نوشته شده توسط m_abasi2004 در بخش C#‎‎
    پاسخ: 3
    آخرین پست: یک شنبه 20 مرداد 1387, 19:59 عصر
  2. رابط Interface کچا کاربرد دارد؟
    نوشته شده توسط shayan_delphi در بخش بانک های اطلاعاتی در Delphi
    پاسخ: 3
    آخرین پست: سه شنبه 15 آذر 1384, 02:17 صبح
  3. یه سوال خیلی مبتدی!!! -Interface به چه دردی می‌خوره؟
    نوشته شده توسط Cheetah در بخش C#‎‎
    پاسخ: 1
    آخرین پست: سه شنبه 25 مرداد 1384, 18:29 عصر
  4. کار با interface
    نوشته شده توسط مهدی فهمیده غلامی در بخش برنامه نویسی در Delphi
    پاسخ: 10
    آخرین پست: جمعه 30 اردیبهشت 1384, 15:24 عصر
  5. what is interface?
    نوشته شده توسط khafanovich در بخش برنامه نویسی در Delphi
    پاسخ: 7
    آخرین پست: چهارشنبه 26 شهریور 1382, 22:50 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •