Autor Wątek: Taki mały problemik z interfejsami  (Przeczytany 3936 razy)

Offline KrystianD

  • Użytkownik
    • http://krystiand.net

# Listopad 21, 2006, 19:31:29
Więc mam taki problem: robie sobie w dll'ce interfejs publiczny. W c# jest modyflikator internal pozwalający na dostęp do zmiennej tylko z tego programu, i teraz jak zrobić coś w stylu:

public interface ISceneNode
{
Vector3 Position { set; get; }

internal Matrix GetWorldMatrix ();
}
??

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Listopad 21, 2006, 22:20:40
Nie da rady. Interfejs może mieć tylko abstrakcyjne metody i niczego więcej. Inaczej to musi być już zwykła klasa, po której odziedziczysz.

Offline KrystianD

  • Użytkownik
    • http://krystiand.net

# Listopad 21, 2006, 22:42:10
A szkoda, bo z tym dziedziczeniem w C# nie za fajnie jest (tzn, dziedziczenie tylko po jednej klasie)... :-\

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Listopad 21, 2006, 22:55:15
A szkoda, bo z tym dziedziczeniem w C# nie za fajnie jest (tzn, dziedziczenie tylko po jednej klasie)... :-\

Możesz się wzorować trochę na Irrlichcie - wykorzystuje on również interfejsy, ale właśnie bez dziedziczenia wielokrotnego. Co notabene potrafi doprowadzić do szewskiej pasji osobę, która próbuje do tego dopisać własne klasy :).

Offline Esidar

  • Użytkownik

# Listopad 21, 2006, 23:06:01
A szkoda, bo z tym dziedziczeniem w C# nie za fajnie jest (tzn, dziedziczenie tylko po jednej klasie)... :-\

I dobrze, że tak jest, bo to daje po łapach tym którzy lubią się zapędzać w wielokrotne dziedzieczenie i klasy virtualne.
Programowanie w C# jest bardziej "dynamiczne". Zorientowane bardziej data driven niż na sztywną hierarchię klas.
Pokombinuj z delegate/event i uzyskasz lepsze efekty.

Offline KrystianD

  • Użytkownik
    • http://krystiand.net

# Listopad 21, 2006, 23:52:30
No właśnie na Irrlichcie sie wzoruje robiąc sobie silnik na wzór właśnie jego. Problem wynikł właśnie z tego że np: mam klase ISceneNode po krórej dziedziczy np. IAnimatedMeshSceneNode i żeby z IAnimatedMeshSceneNode odwołać sie do pól "tylko dla assembla w którym są utworzone (internal)" ISceneNode. Nie wiem jak to robi Irrlicht bo z samych plików nagłówkowych nic nie wynika ???

PS. i tak na marginesie powiedzcie mi czy Irrlicht na poziomie wyświetlenie prostej sceny i obłsuga kolizji wyciąga 600 fps, a mój (w MDX) na tym samym poziomie 250-300 fps to bardzo źle??  :(
« Ostatnia zmiana: Listopad 22, 2006, 00:09:59 wysłana przez kdteam »

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Listopad 21, 2006, 23:57:54
Nie wiem jak to robi Irrlicht bo z samych plików nagłówkowych nic nie wynika ???

Irrlicht jest rozprowadzany razem z kodem źródłowym, więc nie ma problemu w podejrzeniu, jak on to robi :).
« Ostatnia zmiana: Listopad 22, 2006, 00:02:48 wysłana przez Złośliwiec »

Offline KrystianD

  • Użytkownik
    • http://krystiand.net

# Listopad 22, 2006, 00:05:45
rzeczywiście ;D Tak z góry popatrzyłem i nie do końca im sie udało uniknąć wielokrotnego dziedziczenia np:

class CAnimatedMeshMD2 : public IAnimatedMeshMD2, IMesh, IMeshBufferclass IAnimatedMeshMD2 : public IAnimatedMesh ;D

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Listopad 22, 2006, 00:21:37
rzeczywiście ;D Tak z góry popatrzyłem i nie do końca im sie udało uniknąć wielokrotnego dziedziczenia np:

class CAnimatedMeshMD2 : public IAnimatedMeshMD2, IMesh, IMeshBufferclass IAnimatedMeshMD2 : public IAnimatedMesh ;D

O cholercia, faktycznie :). Nie zauważyłem tego, bo do tej pory interesowały mnie głównie klasy z irr::gui :).

Offline KrystianD

  • Użytkownik
    • http://krystiand.net

# Listopad 22, 2006, 00:27:00
Dam sobie ręke uciąć że tego będzie tam jeszcze pełno. Inaczej sie tego nie da zrobić hmm.....(zamiast "nie da" powinno być "nie wiem jak")  :D :D

Offline zarius

  • Użytkownik

# Grudzień 11, 2006, 01:22:16
Moze nie czytalem wszystkiego dokladnie ale

co jes zlego w takim dziedziczeinu interfejsow/klas ? Sam pisze teraz silnik (nie bazujac na niczym x) ) i w niektorych miejscach nie widze innej mozliwosci

Offline Xion

  • Moderator
    • xion.log

# Grudzień 11, 2006, 10:12:16
W dziedziczeniu interfejsów nie ma nic złego, wręcz przeciwnie :) W C++ wprawdzie ich nie ma, ale tak działać będzie zwykła klasa, w której wszystkie metody są czysto wirtualne.
A tak naprawdę to w samym dziedziczeniu wielokrotnym nie ma nic złego, dopóki tylko nie zaczynają tworzyć się cykle (czyli te kilka bazowych pochodzi od wspólnej jednej).

Offline KrystianD

  • Użytkownik
    • http://krystiand.net

# Grudzień 11, 2006, 19:50:46
Może i w dziedziczeniu interfejsów nie ma nic zlego, ale czasem trochę moncą kod, np:

interface Baza
{
Int32 Liczba { get; set; }
}

class Sektor1: Baza
{
Int32 liczba;

public int Liczba
{
get { return liczba; }
set { liczba = value; }
}
}
class Sektor2: Baza
{
Int32 liczba;

public int Liczba
{
get { return liczba; }
set { liczba = value; }
}
}

i to samo za pomocą dziedziczenia klasy:

class Baza
{
Int32 liczba;

public int Liczba
{
get { return liczba; }
set { liczba = value; }
}
}
class Sektor1: Baza
{
}
class Sektor2: Baza
{
}

Tak widać, że gdy dziedziczymy interfejs przez klase trzeba w każdej klasie implementować te same pola, metody, co powoduje że w każdej klasie dziedziczącej mamy identyczny kod tak jak w pierwszym przypadku:

Int32 liczba;

public int Liczba
{
get { return liczba; }
set { liczba = value; }
}

co nie ma miejsca w przypadku dziedziczenia klas, dlatego jest to bardzo dużym ułatwieniem. Tak na przykładzie irrlichta nie musze w każdej klasie dziedziczącej po klasie ISceneNode deklarować pól position rotation scale itp... tylko wszystko sobie siedzi w jednej klasie (ISceneNode) i po niej dziedziczą potomne (np. ICameraSceneNode). Jakby to zrobić na interfejsach to w każdej klasie dziedziczącej po ISceneNode trzebaby deklarować te pola.... a to sie mija z celem...

I jeszcze jedna ważna według mnie rzecz, w interfejsach nie można ustawiać modyflikatorów do pól bądź metod więc wszystkie są public co też się mija z celem.....

Jak dla mnie, ograniczenie dziedziczenia maksymalnie po jednej klasie jest dużym i w sumie niepotrzebnym ograniczeniem... To tak jakby ograniczyć maksymalną liczbe zmiennych w klasie do 20...   :P
« Ostatnia zmiana: Grudzień 11, 2006, 19:53:16 wysłana przez Krystian D. »

Offline Xion

  • Moderator
    • xion.log

# Grudzień 11, 2006, 19:57:17
To trochę zły przykład, bo tutaj należałoby najpierw zrobić implementację int. Baza w nowej klasie, którą dziedziczyłyby potem Sektor1 i Sektor2 (już puste). Trzeba bowiem dobrze określić, gdzie kończą się interfejsy, a zaczynają implementacje.

Offline Riot

  • Użytkownik

# Grudzień 12, 2006, 11:39:48
Jak dla mnie to wogle nalezaloby sie zastanawic nad tym po coz jest klasa a po co interfejs :-\

Interfejs wydaje sie byc pewnym szkieletem. Dajmy na to chcesz zaprogramowac klase ktora bedzie obslugiwac dzialania na wielomianach. W momecie projektowania takiej klasy mozesz stworzyc sobie interfejs, a w nim wrzucac swoje pomysly czyli np. dodawanie/odejmowania wielomianow, obliczania ich wartosci itd. Kiedy juz wszystko bedzie ladnie zaprojektowane to tworzysz klase dziedziczaca po tym  interfejsie i tworzysz to co wymysliles...