C i najprawdopodobniej wiele innych języków zapewnia struct
słowo kluczowe do tworzenia struktur (lub czegoś podobnego). Są to (przynajmniej w C), z uproszczonego punktu widzenia, takie jak klasy, ale bez polimorfizmu, dziedziczenia, metod itd.
Pomyśl o zorientowanym obiektowo (lub paradygmacie) języku o strukturach typu C. Gdzie wybrałbyś je zamiast klas? Teraz nie sądzę, aby można było ich używać z OOP, ponieważ klasy wydają się zastępować ich cele, ale zastanawiam się, czy istnieją sytuacje, w których mogłyby być one preferowane nad klasami w programach zorientowanych obiektowo i w jakich sytuacjach. Czy są takie sytuacje?
Odpowiedzi:
W niektórych książkach istnieje różnica między obiektami niosącymi stan i obiektami zapewniającymi funkcjonalność. Dokładne warunki różnią się w zależności od źródła. Ale ogólnie rzecz biorąc, te pierwsze wyróżniają się szeregiem pól i całą masą prostych par getters-setters (i może konstruktora).
Są to szczególnie powszechne w Javie, dla klas, które są wyraźnie oznaczone jako „możliwe do serializacji”.
Argumentowałbym, że tego rodzaju klasy są najbardziej sensowne jako struktury, jeśli uważasz, że nie ma potrzeby bezpośredniego ukrywania elementów (np. W przypadku typów zagnieżdżonych).
źródło
W C nie ma klas, więc
struct
jest sposób na pakowanie danych. W C ++struct
jest to to samo, coclass
z tym wyjątkiem, że dziedziczenie i dostęp do elementu sąpublic
domyślnie, a nieprivate
. C # ma również coś w rodzajustruct
, ale nie znam wystarczającej liczby C #, aby to skomentować. Common Lisp madefstruct
formę, która działa tak bardzo jak Cs,struct
jak to możliwe, biorąc pod uwagę różnicę językową, i różni się od klasy Common Lisp Object System.Istnieje jednak różnica koncepcyjna między pokrewnym pakietem danych a prawdziwą klasą, aw C ++
struct
jest często używany do pakietu danych, podczas gdyclass
jest używany do obiektów, które powinny mieć własne zachowanie. Jako wytłumaczenie powiedziałbym, że aclass
oznacza coś, o czym można powiedzieć coś użytecznego, na przykład niezmiennik klasy, podczas gdy astruct
byłby luźniej sprzężony z wartościami danych tak naprawdę niezbyt zależnymi od innych.źródło
struct
aclass
jest bardziej znacząca w języku C # - wielką rzeczą jest to, że astruct
jest typem wartości, a aclass
jest typem odniesienia. Microsoft zaleca, aby nie używać a,struct
jeśli zawartość będzie większa niż 16 bajtów.Na bardzo podstawowym poziomie, jaka jest różnica między strukturą a czystą klasą danych (taką, która nie ma żadnej funkcjonalności poza modułami dostępu do właściwości)?
Tak naprawdę tylko ślad pamięci.
źródło
Przyjęta odpowiedź jest dobra. Chciałbym tylko dodać ...
Czasami lepiej jest umieścić metodę w klasie. Innym razem lepiej jest mieć funkcję zewnętrzną, w której struktur / klasa jest przekazywana jako parametr (nawet jeśli wykonujesz styl OOP).
przykład kiedy wstawić metodę do klasy: Rectangle.CaclulateArea ()
przykład kiedy umieścić funkcję poza klasą: Canvas.Draw (Rectangle rect)
możesz umieścić Draw () wewnątrz Prostokąta i to zadziała. Ale rysowanie jest operacją zależną od poziomu. Nie rysowałbyś po stronie serwera, ale po stronie klienta. Draw () nie ma sensu nawet istnieć na serwerze. Jednak „CalculateArea ()” jest niezależny od warstwy i jest prawdziwym atrybutem prostokąta, dlatego lepiej jest uwzględnić go jako metodę członka.
źródło
Dla mnie duża różnica polega na tym, czy istnieje niezmiennik klasy, czy nie.
Innymi słowy: czy mogę w dowolnym momencie zmienić dowolne pole na dowolną wartość? Jeśli tak, jest to struktura; Jeśli nie, to klasa.
Typowym przykładem struktury jest punkt 2D, zawierający tylko element X i Y, który może mieć dowolną wartość i jest całkowicie od siebie niezależny. Publiczny dostęp jest dopuszczalny.
Przykładem klasy jest kombinacja wskaźnika do tablicy znaków i pola długości: długość zależy od wartości wskaźnika, a zatem nie powinna być strukturą. Pola powinny być prywatne, a dostęp powinien przechodzić przez ustawiające i pobierające, aby zapewnić niezmienność klasy.
źródło
1) Sieć
struct
: struktury przesyłane przewodem.Mówiąc bardziej ogólnie i formalnie, każda klasa, której potrzebujesz, to POD, trywialny, standardowy układ lub powiązana koncepcja. Aby uzyskać doskonałe omówienie tych pojęć z przykładami, zobacz tę odpowiedź (dotyczy C ++ 11).
2) Funkcje (w szczególności predykaty), które przeszlibyśmy na funkcje takie jak
std::remove_if
. Inaczej mówiąc, klasy podobne do / dziedziczone zstd::binary_function
lub podobne.3) Koncepcje metaprogramowania, które mogą zawierać tylko publiczne
constexpr
i / lubtypedef
s.Edycja: Uwaga: Ta odpowiedź dotyczy klas C ++ vs struktur.
źródło