Může být instance rozhraní něcím jiným než TObject-em? – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Může být instance rozhraní něcím jiným než TObject-em? – Pascal – Fórum – Programujte.comMůže být instance rozhraní něcím jiným než TObject-em? – Pascal – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
v6ak0
Duch
26. 4. 2009   #1
-
0
-

[Object pascal, FPC] Když chci nacpat instanci rozhraní do TObject, řve to, že to není kompatibilní typ. Nemůžu na tom ani volat free(). Má toto chování nějaké logické opodstatnění? Jak se pak mám vyhnout zbytečným varováním ohledně přetypování na TObject?
EDIT: Jinak TObject(instanceRozhrani).free() způsobí access violation :-(

Nahlásit jako SPAM
IP: 83.240.101.–
v6ak
Reklama
Reklama
Mircosoft+1
Věrný člen
26. 4. 2009   #2
-
0
-

Jestli si to dobře pamatuju (za což neručím), dědí se rozhraní (interface) ze základního typu iinterface a ne tobject. Čili dva naprosto nepříbuzné rodokmeny.

Nahlásit jako SPAM
IP: 85.132.158.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Laaca0
Stálý člen
28. 4. 2009   #3
-
0
-

Dej sem ukázku kódu, ať se na to můžem mrknout.

Nahlásit jako SPAM
IP: 81.0.253.–
DOS-u-akbar
v6ak0
Duch
5. 5. 2009   #4
-
0
-

Měl jsem chybu s mailem, takže jsem nevěděl o nových odpovědích.
Myslel jsem si, že když znám rozhraní v Javě a PHP, tak mě zde Pascal už nemá čím překvapit. Už jsem to asi pochopil:
* (Object)Pascal umožňuje používat rozhraní i z DLL mimo (Object)Pascal, který opravdu nejsou instancí TObjectu
* Nemůžu nijak přetypovat ani zjistit typ rozhraní -> třída. třída->třída, rozhraní -> rozhraní i třída->rozhraní je OK.
* Pro volání metod rozhraní potřebuju třídu přetypovat na rozhraní.
* Pro rozhraní se používá GC (refcounting). Proto toto spadne:

program GCErr;


procedure foo(x:IInterface);
begin // x: zvýšení počtu referencí 0 -> 1
end; // x: snížení počtu referencí 1 -> 0 => úklid

var x:TInterfacedObject;

begin
x := TInterfacedObject.create();
foo(x);
x.free();// uvolňování uklizené proměnné => chyba
end.

* Pro některé operace (supports, as) musí mít rozhraní GUID.
* možná ještě něco

Nahlásit jako SPAM
IP: 83.240.101.–
v6ak
JVM != GCC -O3
~ Anonymní uživatel
1 příspěvek
13. 1. 2011   #5
-
0
-

To v6ak :

* Pro volání metod rozhraní potřebuju třídu přetypovat na rozhraní.

Instance třídy se nepřetypovává, ale volá se GetInterface, který vrátí požadované rozhraní. Tuhle metodu používá i implementace IUnknown.QueryInterface, která potřebuje GUID.

Nahlásit jako SPAM
IP: 89.102.130.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý