abstract và interface ???

1,603 views
Skip to first unread message

son 8x

unread,
Oct 28, 2009, 8:31:58 AM10/28/09
to PHPVietnam
em đọc ebook tiếng anh về cái này mà sao thấy khó hiểu và chưa hình
dung được tác dụng cua nó là gì ??? dùng trong trường hợp nào ???

Các bác có thể ví dụ minh họa giải thích em hiểu hơn về 2 cái này được
ko ạ ???

anhtuannd

unread,
Oct 30, 2009, 9:25:26 AM10/30/09
to PHPVietnam
Hì, có lẽ trước khi đến với PHP, bạn chưa nghiên cứu về lập trình
hướng đối tượng.
Abstract (trừu tượng) là lớp không có instant nào cả, các abstract
method của nó chỉ có tên mà không có nội dung. Các lớp kế thừa từ nó
bắt buộc phải override các phương thức này.
Interface (giao diện) là lớp chỉ gồm tên các method, các lớp kế thừa
nó phải định nghĩa lại đầy đủ các phương thức đã được khai báo ở
interface.

Quan Ly Thanh

unread,
Oct 30, 2009, 12:55:34 PM10/30/09
to PHPVietnam
1 sự khác biệt quan trọng hơn giữa abstract class và interface là:
Abstract class thì không đa kế thừa dc,còn interface thì đa kế thừa vô
tư. Vì thế, hầu như các mẫu trong design pattern ,ng ta dùng interface
chứ ko dùng abstract class.
Thanks

pcdinh

unread,
Oct 31, 2009, 5:11:59 AM10/31/09
to PHPVietnam
Đây là phần giải thích về interface

http://www.ddth.com/showthread.php?t=291056

BeeVN

unread,
Nov 1, 2009, 12:10:53 AM11/1/09
to phpvi...@googlegroups.com
tks a Định.

Vào 16:11 Ngày 31 tháng 10 năm 2009, pcdinh <pcd...@gmail.com> đã viết:

HA MI

unread,
Nov 2, 2009, 11:31:49 PM11/2/09
to phpvi...@googlegroups.com
Interface là 100% abstract class. Nghĩa là các method được khai báo trong interface thì chắc chắn là abstract methods. Còn trong abstrac class có thể có các non-abstract methods.
--
Dương Anh Trà
iSphere Software
15 Hồ Xuân Hương - Hà Nội

"Nguyễn V. Hùng"

unread,
Nov 3, 2009, 12:50:15 AM11/3/09
to phpvi...@googlegroups.com
Chưa thấy ai suy nghĩ theo hướng này. Interface là interface, class là class, 2 cái hoàn toàn khác nhau. Theo tui, tính năng quan trọng nhất của interface là tính đa hình (polymorphism).


From: HA MI <duong...@gmail.com>
Sent: 11/03/2009 11:31:49 AM +0700
To: phpvi...@googlegroups.com
Subject: [PHPVietnam] Re: abstract và interface ???

Quan Ly Thanh

unread,
Nov 3, 2009, 2:11:36 AM11/3/09
to PHPVietnam
Thế abstract class không đa hình dc hả bác?? Có lẽ bác nhầm đa hình và
đa kế thừa chăng? :D

On Nov 2, 9:50 pm, "Nguyễn V. Hùng" <ng.hun...@gmail.com> wrote:
> Chưa thấy ai suy nghĩ theo hướng này. Interface là interface, class là
> class, 2 cái hoàn toàn khác nhau. Theo tui, tính năng quan trọng nhất
> của interface là tính đa hình (polymorphism).
>

> ------------------------------------------------------------------------
> *From:* HA MI <duonganh...@gmail.com>
> *Sent:* 11/03/2009 11:31:49 AM +0700
> *To:* phpvi...@googlegroups.com
> *Subject:* [PHPVietnam] Re: abstract và interface ???


>
> > Interface là 100% abstract class. Nghĩa là các method được khai báo
> > trong interface thì chắc chắn là abstract methods. Còn trong abstrac
> > class có thể có các non-abstract methods.
>

> > 2009/11/1 BeeVN <beevn.com <http://beevn.com>@gmail.com
> > <http://gmail.com>>


>
> >     tks a Định.
>
> >     Vào 16:11 Ngày 31 tháng 10 năm 2009, pcdinh <pcd...@gmail.com

> >     <mailto:pcd...@gmail.com>> đã viết:


>
> >         Đây là phần giải thích về interface
>
> >        http://www.ddth.com/showthread.php?t=291056
>
> >         On Oct 28, 7:31 pm, son 8x <son8...@gmail.com

"Nguyễn V. Hùng"

unread,
Nov 3, 2009, 2:19:42 AM11/3/09
to phpvi...@googlegroups.com
Tất nhiên là được, nhưng ko ai dùng Abstract class vào mục đích đó, trừ khi bất khả kháng.


From: Quan Ly Thanh <lytha...@gmail.com>
Sent: 11/03/2009 2:11:36 PM +0700
To: PHPVietnam <phpvi...@googlegroups.com>
Subject: [PHPVietnam] Re: abstract và interface ???

son 8x

unread,
Nov 3, 2009, 1:54:12 AM11/3/09
to PHPVietnam
cám ơn các bác nhiều !!!
Em đọc quyển OOP PHP solution mà thấy nó viết ví dụ rời rạc quá.
Có bác nào giới thiệu cho em quyển ebook nào nói về hướng đối tượng
trong PHP good ko ???
Hic, em đang tìm một ebook nói về OOP có nhiều ví dụ (như là build một
app nhỏ) để vừa đọc vừa theo dõi, trình độ tiếng anh em thì kém mà nó
viết chữ nhiều, ví dụ ít làm em khó hiểu quá.

Thanks các bác nhiều :)

HA MI

unread,
Nov 3, 2009, 3:45:32 AM11/3/09
to phpvi...@googlegroups.com
:) Tớ không tự nghĩ ra các concepts kia, đấy là từ sách ôn thi SCJP viết đấy. :p Còn nhiều nữa, nhưng nếu để phân biệt 2 con interface và abstract class thì có thể nhấn mạnh vào điểm kia. Trong interface ko thể có các non-abstract methods, nhưng trong abstract class thì có thể.

2009/11/3 son 8x <son...@gmail.com>



--
Dương Anh Trà
Viettel Technologies
K2 Pham Hung - Hanoi

Quan Ly Thanh

unread,
Nov 3, 2009, 3:46:42 AM11/3/09
to PHPVietnam
Àh,cái này em mới nghe đây. Ý bác là dùng interface để phục vụ cho nhu
cầu đa hình chứ gì?
Bác chỉ rõ ra bất lợi khi mình dùng abstract class để đa hình xem nào?

On Nov 2, 11:19 pm, "Nguyễn V. Hùng" <ng.hun...@gmail.com> wrote:
> Tất nhiên là được, nhưng ko ai dùng Abstract class vào mục đích đó, trừ
> khi bất khả kháng.
>

> ------------------------------------------------------------------------
> *From:* Quan Ly Thanh <lythanhq...@gmail.com>
> *Sent:* 11/03/2009 2:11:36 PM +0700
> *To:* PHPVietnam <phpvi...@googlegroups.com>

"Nguyễn V. Hùng"

unread,
Nov 3, 2009, 4:19:18 AM11/3/09
to phpvi...@googlegroups.com
Okie, tùy bạn, tớ ko thích cãi nhau kiểu "cày cối" thế này, cái này còn tùy thuộc vào style mỗi người, đối với mình, nếu đa hình mà dùng abstract class thì ko triệt để.

Ví dụ:

Interface People {
    method 1;
    method 2;
    ...
    method n;
}

Abstract class DumpPeople implement People {
    method 1 { // implement method 1 }
    method isDump() { // show how dump he is }
}

Sau đó, xét 2 method dưới đây:

void fight(People p1, People p2);
void fight(DumpPeople p1, DumpPeople p2);

Đã thấy điểm bất lợi chưa?


From: Quan Ly Thanh <lytha...@gmail.com>
Sent: 11/03/2009 3:46:42 PM +0700
To: PHPVietnam <phpvi...@googlegroups.com>
Subject: [PHPVietnam] Re: abstract và interface ???

Quan Ly Thanh

unread,
Nov 3, 2009, 4:32:18 AM11/3/09
to PHPVietnam
O*,co le kien thuc nong cac,den gio van chua thay diem bat loi,ban
giai thich ro~ hon nhe'. Con nua,VD ban noi abstract class DumpPeople
ma sao ko thay method nao la abstract class het vay, that su VD cua
ban la`m mi`nh mu` mo*` ho*n

Quan Ly Thanh

unread,
Nov 3, 2009, 5:00:02 AM11/3/09
to PHPVietnam
Sorry mọi người vì spam nhe,nhưng mình muốn tranh luận để rõ hơn
thôi,hồi nãy chưa đọc kỹ :).
Theo VD của bạn, mình có thể viết lại như vầy = abstract class :
abstract class People {
abstract method 1;
abstract method 2;
...
abstract method n;
}

class DumpPeople1 implement People {
method 1 { // implement method 1 }
method 2() { // show how dump he is }
method n; { // implement method n }
}
class DumpPeople2 implement People {
method 1 { // implement method 1 }
method 2() { // show how dump he is }
....
method n;{ // implement method n }
}

Sau đó, xét 2 method dưới đây:

void fight(People p1, People p2);

Với People p1 = new DumpPeople1();
People p2 = new DumpPeople2();

Thế thì khác với VD của bác ở chỗ nào nhỉ?

On Nov 3, 1:19 am, "Nguyễn V. Hùng" <ng.hun...@gmail.com> wrote:
> Okie, tùy bạn, tớ ko thích cãi nhau kiểu "cày cối" thế này, cái này còn
> tùy thuộc vào style mỗi người, đối với mình, nếu đa hình mà dùng
> abstract class thì ko triệt để.
>
> Ví dụ:
>
> Interface People {
>     method 1;
>     method 2;
>     ...
>     method n;
>
> }
>
> Abstract class DumpPeople implement People {
>     method 1 { // implement method 1 }
>     method isDump() { // show how dump he is }
>
> }
>
> Sau đó, xét 2 method dưới đây:
>
> void fight(People p1, People p2);
> void fight(DumpPeople p1, DumpPeople p2);
>
> Đã thấy điểm bất lợi chưa?
>
> ------------------------------------------------------------------------
> *From:* Quan Ly Thanh <lythanhq...@gmail.com>
> *Sent:* 11/03/2009 3:46:42 PM +0700

"Nguyễn V. Hùng"

unread,
Nov 3, 2009, 5:06:07 AM11/3/09
to phpvi...@googlegroups.com
Ờ thì ko khác, nhưng nhìn lại cái abstract class của bác xem bản chất nó là gì =))


From: Quan Ly Thanh <lytha...@gmail.com>
Sent: 11/03/2009 5:00:02 PM +0700
To: PHPVietnam <phpvi...@googlegroups.com>
Subject: [PHPVietnam] Re: abstract và interface ???

HA MI

unread,
Nov 3, 2009, 5:24:20 AM11/3/09
to phpvi...@googlegroups.com
Nói chung là tớ cũng chả hiểu 2 bạn này đang làm cái gì? =))
Ông Hùng thì viết 1 cái abstract class mà ko hề có 1 abstract method nào. Sau đấy đưa ra 2 cái lời gọi hàm fight, cũng chả hiểu là có gì bất lợi?
Ông Thanh thì viết 2 cái class "implement" 1 cái abstract class khác, mà thực chất ở đây phải là extend chứ ko phải là implement. :P



2009/11/3 "Nguyễn V. Hùng" <ng.h...@gmail.com>

"Nguyễn V. Hùng"

unread,
Nov 3, 2009, 5:32:15 AM11/3/09
to phpvi...@googlegroups.com
Nếu 1 abstract class implement 1 interface, nếu nó ko implement method nào đó, có nghĩa method đó là abstract, class nào extend nó bắt buộc phải implement.


From: HA MI <duong...@gmail.com>
Sent: 11/03/2009 5:24:20 PM +0700
To: phpvi...@googlegroups.com

skydunkpro

unread,
Nov 3, 2009, 6:14:02 AM11/3/09
to PHPVietnam
Nếu vứt interface đi chỉ dùng abstract class, xet vd sau:

abstract class Dog { ... }
abstract class Cat { ... }

tôi ko thể có được một "đột biến gen" như viết thế này được:

abstract class CatDog extends Dog, Cat { } // wrong

Nhưng với interface dùng implement thì okie:

interface Dog { ... }
interface Cat { ... }
interface CatDog implements Dog, Cat { ... }

Hay nói cách khác chỉ sử dụng abstract class cho polymorphism là ko
triệt để vì ta ko thể có được tính đa hình linh hoạt thật sự như khi
dùng interface !! Abstract class bản chất vẫn là 1 class, ko phải là
một công cụ tốt để "kế thừa thành quả thiết kế", nhưng điểm mạnh là nó
vẫn cho phép "kế thừa thành quả thi công" và polimorphism ở 1 vài
trường hợp.

On 3 Tháng Mười Một, 17:32, "Nguyễn V. Hùng" <ng.hun...@gmail.com>
wrote:


> Nếu 1 abstract class implement 1 interface, nếu nó ko implement method
> nào đó, có nghĩa method đó là abstract, class nào extend nó bắt buộc
> phải implement.
>

> ------------------------------------------------------------------------
> *From:* HA MI <duonganh...@gmail.com>

> *Sent:* 11/03/2009 5:24:20 PM +0700


> *To:* phpvi...@googlegroups.com
> *Subject:* [PHPVietnam] Re: abstract và interface ???
>

> > Nói chung là tớ cũng chả hiểu 2 bạn này đang làm cái gì? =))
> > Ông Hùng thì viết 1 cái abstract class mà ko hề có 1 abstract method
> > nào. Sau đấy đưa ra 2 cái lời gọi hàm fight, cũng chả hiểu là có gì
> > bất lợi?
> > Ông Thanh thì viết 2 cái class "implement" 1 cái abstract class khác,
> > mà thực chất ở đây phải là extend chứ ko phải là implement. :P
>

> > 2009/11/3 "Nguyễn V. Hùng" <ng.hun...@gmail.com
> > <mailto:ng.hun...@gmail.com>>


>
> >     Ờ thì ko khác, nhưng nhìn lại cái abstract class của bác xem bản
> >     chất nó là gì =))
>

> >     ------------------------------------------------------------------------
> >     *From:* Quan Ly Thanh <lythanhq...@gmail.com>

> >     <mailto:lythanhq...@gmail.com>
> >     *Sent:* 11/03/2009 5:00:02 PM +0700
>
> >     *To:* PHPVietnam <phpvi...@googlegroups.com>
> >     <mailto:phpvi...@googlegroups.com>


> >     *Subject:* [PHPVietnam] Re: abstract và interface ???
>

> >>     Sorry mọi người vì spam nhe,nhưng mình muốn tranh luận để rõ hơn
> >>     thôi,hồi nãy chưa đọc kỹ :).
> >>     Theo VD của bạn, mình có thể viết lại như vầy = abstract class :
> >>     abstract class People {
> >>         abstract method 1;
> >>         abstract method 2;
> >>         ...
> >>         abstract method n;
> >>     }
>
> >>     class DumpPeople1 implement People {
> >>         method 1 { // implement method 1 }
> >>         method 2() { // show how dump he is }
> >>        method n;  { // implement method n }
> >>     }
> >>     class DumpPeople2 implement People {
> >>         method 1 { // implement method 1 }
> >>         method 2() { // show how dump he is }
> >>        ....
> >>        method n;{ // implement method n }
> >>     }
>
> >>     Sau đó, xét 2 method dưới đây:
>
> >>     void fight(People p1, People p2);
>
> >>     Với People p1 = new DumpPeople1();
> >>     People p2 = new DumpPeople2();
>
> >>     Thế thì khác với VD của bác ở chỗ nào nhỉ?
>

> >>     On Nov 3, 1:19 am, "Nguyễn V. Hùng" <ng.hun...@gmail.com> <mailto:ng.hun...@gmail.com> wrote:
>
> >>>     Okie, tùy bạn, tớ ko thích cãi nhau kiểu "cày cối" thế này, cái này còn
> >>>     tùy thuộc vào style mỗi người, đối với mình, nếu đa hình mà dùng
> >>>     abstract class thì ko triệt để.
>
> >>>     Ví dụ:
>
> >>>     Interface People {
> >>>         method 1;
> >>>         method 2;
> >>>         ...
> >>>         method n;
>
> >>>     }
>
> >>>     Abstract class DumpPeople implement People {
> >>>         method 1 { // implement method 1 }
> >>>         method isDump() { // show how dump he is }
>
> >>>     }
>
> >>>     Sau đó, xét 2 method dưới đây:
>
> >>>     void fight(People p1, People p2);
> >>>     void fight(DumpPeople p1, DumpPeople p2);
>
> >>>     Đã thấy điểm bất lợi chưa?
>
> >>>     ------------------------------------------------------------------------

> >>>     *From:* Quan Ly Thanh <lythanhq...@gmail.com> <mailto:lythanhq...@gmail.com>


> >>>     *Sent:* 11/03/2009 3:46:42 PM +0700

> >>>     *To:* PHPVietnam <phpvi...@googlegroups.com> <mailto:phpvi...@googlegroups.com>


> >>>     *Subject:* [PHPVietnam] Re: abstract và interface ???
>
> >>>>     Àh,cái này em mới nghe đây. Ý bác là dùng interface để phục vụ cho nhu
> >>>>     cầu đa hình chứ gì?
> >>>>     Bác chỉ rõ ra bất lợi khi mình dùng abstract class để đa hình xem nào?
>

> >>>>     On Nov 2, 11:19 pm, "Nguyễn V. Hùng" <ng.hun...@gmail.com> <mailto:ng.hun...@gmail.com> wrote:
>
> >>>>>     Tất nhiên là được, nhưng ko ai dùng Abstract class vào mục đích đó, trừ
> >>>>>     khi bất khả kháng.
>
> >>>>>     ------------------------------------------------------------------------

> >>>>>     *From:* Quan Ly Thanh <lythanhq...@gmail.com> <mailto:lythanhq...@gmail.com>


> >>>>>     *Sent:* 11/03/2009 2:11:36 PM +0700

> >>>>>     *To:* PHPVietnam <phpvi...@googlegroups.com> <mailto:phpvi...@googlegroups.com>


> >>>>>     *Subject:* [PHPVietnam] Re: abstract và interface ???
>
> >>>>>>     Thế abstract class không đa hình dc hả bác?? Có lẽ bác nhầm đa hình và
> >>>>>>     đa kế thừa chăng? :D
>

> >>>>>>     On Nov 2, 9:50 pm, "Nguyễn V. Hùng" <ng.hun...@gmail.com> <mailto:ng.hun...@gmail.com> wrote:
>
> >>>>>>>     Chưa thấy ai suy nghĩ theo hướng này. Interface là interface, class là
> >>>>>>>     class, 2 cái hoàn toàn khác nhau. Theo tui, tính năng quan trọng nhất
> >>>>>>>     của interface là tính đa hình (polymorphism).
>
> >>>>>>>     ------------------------------------------------------------------------

> >>>>>>>     *From:* HA MI <duonganh...@gmail.com> <mailto:duonganh...@gmail.com>


> >>>>>>>     *Sent:* 11/03/2009 11:31:49 AM +0700

> >>>>>>>     *To:* phpvi...@googlegroups.com <mailto:phpvi...@googlegroups.com>


> >>>>>>>     *Subject:* [PHPVietnam] Re: abstract và interface ???
>
> >>>>>>>>     Interface là 100% abstract class. Nghĩa là các method được khai báo
> >>>>>>>>     trong interface thì chắc chắn là abstract methods. Còn trong abstrac
> >>>>>>>>     class có thể có các non-abstract methods.
>

> >>>>>>>>     2009/11/1 BeeVN <beevn.com <http://beevn.com> <http://beevn.com>@gmail.com <http://gmail.com>

"Nguyễn V. Hùng"

unread,
Nov 3, 2009, 6:22:58 AM11/3/09
to phpvi...@googlegroups.com
Sorry, bổ sung thêm cái sai của "Interface là 100% abstract class", interface ko được quyền có property, trong khi abstract class thì có.


From: HA MI <duong...@gmail.com>
Sent: 11/03/2009 11:31:49 AM +0700
To: phpvi...@googlegroups.com
Subject: [PHPVietnam] Re: abstract và interface ???

Quan Ly Thanh

unread,
Nov 3, 2009, 6:29:38 AM11/3/09
to PHPVietnam

Sorry vì hồi nãy tôi copy mà quên sửa implement thành extends.
Như vầy nhé, cái mà bạn ví dụ đó là đa kế thừa, ko phải đa hình nhé.
Vui lòng đọc lại tài liệu đi nhé.

"Nguyễn V. Hùng"

unread,
Nov 3, 2009, 6:35:17 AM11/3/09
to phpvi...@googlegroups.com
Haizzz, đọc kỹ cái ví dụ & suy nghĩ thêm lần nữa đi bác à.


From: Quan Ly Thanh <lytha...@gmail.com>
Sent: 11/03/2009 6:29:38 PM +0700
To: PHPVietnam <phpvi...@googlegroups.com>
Subject: [PHPVietnam] Re: abstract và interface ???

Hùng Trần Đức

unread,
Nov 3, 2009, 6:58:27 AM11/3/09
to phpvi...@googlegroups.com
PHP hơi "lỏng lẻo" kiểu dữ liệu hơn C#, Java nên hình như trong PHP, Interface chỉ tốt cho việc "kế thừa thành quả thiết kế". Vậy theo các bác khi nào nên dùng abstract, khi nào nên dùng Interface.

Quan Ly Thanh

unread,
Nov 3, 2009, 8:51:18 AM11/3/09
to PHPVietnam
Tôi ko có nói bác,tôi nói skydunkpro cơ :|

On Nov 3, 6:35 pm, "Nguyễn V. Hùng" <ng.hun...@gmail.com> wrote:
> Haizzz, đọc kỹ cái ví dụ & suy nghĩ thêm lần nữa đi bác à.
>

> ------------------------------------------------------------------------
> *From:* Quan Ly Thanh <lythanhq...@gmail.com>

> *Sent:* 11/03/2009 6:29:38 PM +0700
> *To:* PHPVietnam <phpvi...@googlegroups.com>

"Nguyễn V. Hùng"

unread,
Nov 3, 2009, 9:59:55 AM11/3/09
to phpvi...@googlegroups.com
Tất nhiên là tui nói ví dụ của skydunkpro :|
Thú thực là mới đọc vào, tui đã định reply bác ấy về sự nhầm lẫn, nhưng nghĩ kỹ thì có cả polymorphism trong ví dụ đó.


From: Quan Ly Thanh <lytha...@gmail.com>
Sent: 11/03/2009 8:51:18 PM +0700
To: PHPVietnam <phpvi...@googlegroups.com>
Subject: [PHPVietnam] Re: abstract và interface ???

skydunkpro

unread,
Nov 3, 2009, 10:05:49 AM11/3/09
to PHPVietnam
úi giời !! tôi chán bác quá !!

Tôi đang nói đến việc tạo ra các hình thái (hay giao diện, hay
interface, hay ... gì gì đó cũng đc) khác nhau của cùng một cây đối
tượng !!
Thế ko lẽ tôi phải viết "thêm" thế này bác mới chịu là đa hình:

class DogImpl implements Dog { ... }
class CatDogImpl implements CatDog { ... }

Dog dog1 = new DogImpl ();
Dog monster = new CatDogImpl();

ps: Mà bác luôn nhắc đến cái "đa kế thừa" trong pure OOP là kế thừa
cái gì thế ??? Thế người ta bảo trong OOP ko cho phép "đa kế thừa", là
ko cho phép cái gì thế ?? haizz ...

On 3 Tháng Mười Một, 20:51, Quan Ly Thanh <lythanhq...@gmail.com>
wrote:

"Nguyễn V. Hùng"

unread,
Nov 3, 2009, 10:52:44 AM11/3/09
to phpvi...@googlegroups.com
Hehe, tớ khoái cái JGentle của cậu, Spring hay chính xác hơn là tính năng IoC của Spring chính là thứ lôi tớ từ PHP sang Java, tuy nhiên thích thì thích nhưng đến giờ vẫn gà, bữa nào rảnh sẽ download source của JGentle về ngâm cứu :-)


From: skydunkpro <skydu...@gmail.com>
Sent: 11/03/2009 10:05:49 PM +0700
To: PHPVietnam <phpvi...@googlegroups.com>
Subject: [PHPVietnam] Re: abstract và interface ???

son 8x

unread,
Nov 4, 2009, 10:32:04 PM11/4/09
to PHPVietnam
trong bài viết của bác pcdinh có đoạn code:

/
*************************************************************************/
class SecurityStaff
{
public function check(GuestRequirement $guest)
{
if (empty($guest->getPassport()))
{
throw new Exception('Passport phải mang theo');
}

if (false === $this->hasAppointment($guest->getName()))
{
throw new Exception('No appointment ');
}
}
}
*************************************************************************/


Em thắc mắc ở chỗ:
/**********************************************************
public function check(GuestRequirement $guest)
**********************************************************/
sao lại có GuestRequirement trong fuction check ???

tuanhoang

unread,
Nov 5, 2009, 4:20:16 AM11/5/09
to PHPVietnam
@son8x: function check() có tham số $guest có kiểu dữ liệu
GuestRequirement, GuestRequirement là một kiểu dữ liệu đã được khai
báo trước đó. Mình hiểu vậy không biết có nhầm gì không ta

Giang Nguyen Hoang Duc

unread,
Nov 5, 2009, 5:53:03 AM11/5/09
to PHPVietnam
xin lỗi, nhưng em đọc đi đọc lại ví dụ của bác vẫn ko hiểu ý của bác
là gì? Thứ 1 vd của bác không có function nào, thứ 2 1 cái thì là đa
thừa kế, còn 1 cái là đa hình, thứ 3 vẫn chưa nói lên được abstract
class khác interface thế nào, ngoại trừ cái implement, mà cái này rõ
ràng là đa thừa kế, không phải đa hình, thứ 4 không cho phép đa thừa
kế không có nghĩa là không làm hỗ trợ, bằng chứng là interface.

em là lính mới, nhưng hình như em thấy bác có chút nhầm lẫn về căn bản
OOP, không biết em nói thế có sai gì không.

"Nguyễn V. Hùng"

unread,
Nov 5, 2009, 9:18:44 AM11/5/09
to phpvi...@googlegroups.com
Hix, người ta đã ghi ra đến tận đấy mà bác còn ko thấy đa hình chỗ nào à? Thế bác thấy cái instance dog1monster giống nhau chỗ nào? Và rõ ràng điểm bất lợi của abstract class là bạn không thể linh động bằng interface khi đa hình. Chính bác mới là ko phân biệt được chỗ nào là đa hình, chỗ nào là đa thừa kế.


From: Giang Nguyen Hoang Duc <giang.nguy...@gmail.com>
Sent: 11/05/2009 5:53:03 PM +0700
To: PHPVietnam <phpvi...@googlegroups.com>
Subject: [PHPVietnam] Re: abstract và interface ???

none

unread,
Nov 5, 2009, 9:52:01 AM11/5/09
to PHPVietnam
Thiệt tình đọc bữa giờ vẫn chưa thấy đoạn code nào mà thể hiện tính
"đa hình" nữa :))

Thằng bạn ghẻ ghẻ của tui đọc thread này xong có bình luận vậy nè:
- Có một ông ói 1 bãi code lên dọa ông kia: Thấy méc cười chưa
cưng :">? ;))
- Ông kia cười cạch cạch ;)) rùi hỏi lại: Ủa méc cười chỗ nào :-?
- Rồi ông nọ nhảy vô ói tiếp 1 bãi code rùi nói: Nè, giờ thì cười
chưa? =))
- Và ông kia mặt đanh lại mà bảo rằng: Há há, mắc cười ghê ;))

instcode

unread,
Nov 5, 2009, 9:55:15 AM11/5/09
to PHPVietnam
Mình cũng rứa :( Chắc tại mình hông có khiếu hài hước :(

"Nguyễn V. Hùng"

unread,
Nov 5, 2009, 10:35:03 AM11/5/09
to phpvi...@googlegroups.com
Ờ, hố hố, giờ toàn ói với bãi, đúng là mắc cười thiệt, vãi =))


From: none <bacd...@gmail.com>
Sent: 11/05/2009 9:52:01 PM +0700

To: PHPVietnam <phpvi...@googlegroups.com>
Subject: [PHPVietnam] Re: abstract và interface ???

"Nguyễn V. Hùng"

unread,
Nov 5, 2009, 10:41:00 AM11/5/09
to phpvi...@googlegroups.com
Quên, phẹt thêm 1 bãi cho mấy ông chưa thấy tính "đa hình" trong mấy bãi code vừa rồi: http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming


From: none <bacd...@gmail.com>
Sent: 11/05/2009 9:52:01 PM +0700

To: PHPVietnam <phpvi...@googlegroups.com>
Subject: [PHPVietnam] Re: abstract và interface ???

Khoa Nguyen

unread,
Nov 5, 2009, 11:08:25 AM11/5/09
to phpvi...@googlegroups.com
Phẹt cái nớ thì đúng rùi nhưng hình như các bạn của mình hông có đọc nó hay sao á? Giờ Kai thử so cái đống phẹt đó với những đống đã phẹt coi có khác nhau gì hông? :-? Nói theo kiểu của bé KENT là "phân tích kết cấu" cái đống phẹt á :">

Gợi ý là đọc lại bài của bạn Giang Nguyen Hoang Duc vài lần nữa :">

2009/11/5 "Nguyễn V. Hùng" <ng.h...@gmail.com>

none

unread,
Nov 5, 2009, 11:14:26 AM11/5/09
to PHPVietnam
:(.
Giờ thì thấy người ta há mỏ cười với nhau nhiều quá, ông này phẹt 1
đống trét lại.
:(

On Nov 5, 11:08 pm, Khoa Nguyen <instc...@gmail.com> wrote:
> Phẹt cái nớ thì đúng rùi nhưng hình như các bạn của mình hông có đọc nó hay
> sao á? Giờ Kai thử so cái đống phẹt đó với những đống đã phẹt coi có khác
> nhau gì hông? :-? Nói theo kiểu của bé KENT là "phân tích kết cấu" cái đống
> phẹt á :">
>
> Gợi ý là đọc lại bài của bạn Giang Nguyen Hoang Duc vài lần nữa :">
>

> 2009/11/5 "Nguyễn V. Hùng" <ng.hun...@gmail.com>


>
> >  Quên, phẹt thêm 1 bãi cho mấy ông chưa thấy tính "đa hình" trong mấy bãi
> > code vừa rồi:
> >http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
>

> >  ------------------------------
> > *From:* none <bacdu...@gmail.com> <bacdu...@gmail.com>
> > *Sent:* 11/05/2009 9:52:01 PM +0700
>
> > *To:* PHPVietnam <phpvi...@googlegroups.com><phpvi...@googlegroups.com>
> > *Subject:* [PHPVietnam] Re: abstract và interface ???

"Nguyễn V. Hùng"

unread,
Nov 5, 2009, 11:16:52 AM11/5/09
to phpvi...@googlegroups.com
Ối giời, phẹt đến thế mà bác còn bảo em phải đọc lại bài của bác Giang Nguyen Hoang Duc thì em chịu rùi, ý bác là đa hình thì phải có function, phải có input params, rồi treat mấy cái instance của nhiều class khác nhau như cùng 1 interface á? Phải viết huỵch toẹt tới mức đó thì bác mới chịu là đa hình á. Các bác khó tính nhễy ;))


From: Khoa Nguyen <inst...@gmail.com>
Sent: 11/05/2009 11:08:25 PM +0700
To: phpvi...@googlegroups.com

Subject: [PHPVietnam] Re: abstract và interface ???

Quan Ly Thanh

unread,
Nov 5, 2009, 11:19:25 AM11/5/09
to PHPVietnam
Hài quá, đang chờ mail của sếp approved thì nhận dc cả đống mail này.

E hèm,mình xin nhờ bạn Hùng định nghĩa lại đa hình và đa kế thừa dùm
mình nha.

Theo như suy nghĩ của bạn thì tất cả những gì mình đã học và đang làm
sai hết rồi, huhu. Lúc đầu mình muốn làm bật cho bạn thấy là đa hình
thì xài abstract class và interface cũng như nhau, bạn tạo 1 class
abstract toàn chứa abstract method xem nó có khác interface chỗ nào
ko.
Đa kế thừa class bị cấm,điều này tơi đồng ý. Nhưng bác có biết tại sao
sinh ra interface ko? Lý do đa kế thừa class bị cấm là gì?

P/S: Thông thường ng ta xài interface thay cho abstract vì tính đa kế
thừa của nó bác à,abstract class thì ko đa kế thừa dc.


On Nov 5, 10:41 pm, "Nguyễn V. Hùng" <ng.hun...@gmail.com> wrote:
> Quên, phẹt thêm 1 bãi cho mấy ông chưa thấy tính "đa hình" trong mấy bãi
> code vừa rồi:http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
>

> ------------------------------------------------------------------------
> *From:* none <bacdu...@gmail.com>
> *Sent:* 11/05/2009 9:52:01 PM +0700
> *To:* PHPVietnam <phpvi...@googlegroups.com>
> *Subject:* [PHPVietnam] Re: abstract và interface ???

"Nguyễn V. Hùng"

unread,
Nov 5, 2009, 11:24:29 AM11/5/09
to phpvi...@googlegroups.com
Thôi em lượn đây, bác none lặn hụp vui nhé, em chịu thua bác rồi, bác bẩn vô địch rồi ;))


From: none <bacd...@gmail.com>
Sent: 11/05/2009 11:14:26 PM +0700
To: PHPVietnam <phpvi...@googlegroups.com>
Subject: [PHPVietnam] Re: abstract và interface ???

Quan Ly Thanh

unread,
Nov 5, 2009, 11:29:00 AM11/5/09
to PHPVietnam
Bác quote tôi cũng quote lại cho bác nè http://mindprod.com/jgloss/interfacevsabstract.html
:)

Khoa Nguyen

unread,
Nov 5, 2009, 11:31:23 AM11/5/09
to phpvi...@googlegroups.com
Hơ, sao vậy lại là khó tính :( Vấn đề mấu chốt là nằm ở chỗ đó mà các bác nói nhăng nói cuội nói dông nói dài nói dai nói dở.. nhưng vẫn kô chỉ ra được thì... quá vô ích chớ sao? :">

Mà hông hiểu là tại sao có người đọc qua bài của bạn GNHD vẫn chưa ngộ ra cần reply lại cái gì mà lại còn chửi bạn í hông hiểu gì về đa hình và đa thừa kế nữa? Hix, cho nên mình phải gõ vài dòng tương trợ thôi à :">

Thôi, vậy làm rõ được rùi nha :"> Bữa sau "đa hình" hông phải là đi viết mấy cái "implements" Chó Mèo loạn xạ rùi nhìn vô mà cười: "Haha, thấy đa hình chưa ku?" mà cần phải viết thêm mấy cái method sủa "Meo meo" hay "Gâu gâu" nha :))

Bí bo em bín đây :">

P/S: Thấy mình vui hông =)) Vậy mà có người kêu mình khó tính :(

2009/11/6 "Nguyễn V. Hùng" <ng.h...@gmail.com>

skydunkpro

unread,
Nov 5, 2009, 11:55:46 AM11/5/09
to PHPVietnam
Bài viết về chó , mèo là của tôi đấy, ko phải của bác Hưng !! Câu
chuyện bắt đầu là bác Thành nói interface đa hình đc gì thì abstract
class làm được như thế ấy, tôi viết nhanh và chia thành 2 bài post nên
có vẻ hơi khó hiểu :). Bây giờ viết lại đầy đủ vậy (tôi viết = java):

interface Cat {}
interface Dog {}
interface CatDog extends Cat, Dog {}

class CatDogImpl implements CatDog {}

class LamThit {
public void lamthit(Dog obj) {
System.out.println("run ....");
}
}

public class Test {
public static void main(String[] args) {
Cat cat = new CatDogImpl();
LamThit obj = new LamThit();
obj.lamthit((Dog) cat);
}
}

to Hưng: cái site của cậu ko phải là ý tôi muốn nói trong cái ví dụ
của tôi !!

to Giang: thứ 1: ko có method trong interface vì tôi thấy ko cần
thiết, thứ 2: có lẽ do tôi post 2 bài khác nhau nên bạn ko để ý kiểu
đối tượng, thứ 3: bạn ko phân biệt được abstract class và interface vì
bạn ko hiểu cái "đa thừa kế" trong OOP là thừa kế cái gì và bởi vì
quan niệm phân biệt "đa thừa kế" thì chẳng liên quan gì đến "đa hình",
thứ 4: interface cho phép "đa thừa kế" trong OOP, bạn hiểu nó được hỗ
trợ, nhưng bạn chẳng hiểu nó hỗ trợ để làm cái gì !

ps: có ai trả lời dùm tôi "đa thừa kế" trong OOP là thừa kế "cái gì"
được ko ??? có vẻ cái thread này khiến nhiều người khổ công tìm kiếm
tài liệu dzữ !! :)

On 5 Tháng Mười Một, 23:31, Khoa Nguyen <instc...@gmail.com> wrote:
> Hơ, sao vậy lại là khó tính :( Vấn đề mấu chốt là nằm ở chỗ đó mà các bác
> nói nhăng nói cuội nói dông nói dài nói dai nói dở.. nhưng vẫn kô chỉ ra
> được thì... quá vô ích chớ sao? :">
>
> Mà hông hiểu là tại sao có người đọc qua bài của bạn GNHD vẫn chưa ngộ ra
> cần reply lại cái gì mà lại còn chửi bạn í hông hiểu gì về đa hình và đa
> thừa kế nữa? Hix, cho nên mình phải gõ vài dòng tương trợ thôi à :">
>
> Thôi, vậy làm rõ được rùi nha :"> Bữa sau "đa hình" hông phải là đi viết mấy
> cái "implements" Chó Mèo loạn xạ rùi nhìn vô mà cười: "Haha, thấy đa hình
> chưa ku?" mà cần phải viết thêm mấy cái method sủa "Meo meo" hay "Gâu gâu"
> nha :))
>
> Bí bo em bín đây :">
>
> P/S: Thấy mình vui hông =)) Vậy mà có người kêu mình khó tính :(
>

> 2009/11/6 "Nguyễn V. Hùng" <ng.hun...@gmail.com>


>
> >  Ối giời, phẹt đến thế mà bác còn bảo em phải đọc lại bài của bác Giang
> > Nguyen Hoang Duc thì em chịu rùi, ý bác là đa hình thì phải có function,
> > phải có input params, rồi treat mấy cái instance của nhiều class khác nhau
> > như cùng 1 interface á? Phải viết huỵch toẹt tới mức đó thì bác mới chịu là
> > đa hình á. Các bác khó tính nhễy ;))
>

> >  ------------------------------
> > *From:* Khoa Nguyen <instc...@gmail.com> <instc...@gmail.com>
> > *Sent:* 11/05/2009 11:08:25 PM +0700
> > *To:* phpvi...@googlegroups.com
>
> > *Subject:* [PHPVietnam] Re: abstract và interface ???


>
> > Phẹt cái nớ thì đúng rùi nhưng hình như các bạn của mình hông có đọc nó hay
> > sao á? Giờ Kai thử so cái đống phẹt đó với những đống đã phẹt coi có khác
> > nhau gì hông? :-? Nói theo kiểu của bé KENT là "phân tích kết cấu" cái đống
> > phẹt á :">
>
> > Gợi ý là đọc lại bài của bạn Giang Nguyen Hoang Duc vài lần nữa :">
>

> > 2009/11/5 "Nguyễn V. Hùng" <ng.hun...@gmail.com>


>
> >>  Quên, phẹt thêm 1 bãi cho mấy ông chưa thấy tính "đa hình" trong mấy bãi
> >> code vừa rồi:
> >>http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
>

> >>  ------------------------------
> >> *From:* none <bacdu...@gmail.com> <bacdu...@gmail.com>
> >> *Sent:* 11/05/2009 9:52:01 PM +0700
>
> >> *To:* PHPVietnam <phpvi...@googlegroups.com><phpvi...@googlegroups.com>

> >> *Subject:* [PHPVietnam] Re: abstract và interface ???

skydunkpro

unread,
Nov 5, 2009, 12:00:14 PM11/5/09
to PHPVietnam
à quên, ai đó nói abstract class làm được tất thì chuyển hộ tôi cái vd
đó sang abstract class cái !!

"Nguyễn V. Hùng"

unread,
Nov 5, 2009, 12:27:57 PM11/5/09
to phpvi...@googlegroups.com
Tất nhiên là tôi hiểu cái ví dụ của bạn nhằm mục đích gì (cái ví dụ của tôi ko rõ nghĩa bằng cái ví dụ của bạn). Tôi chỉ muốn nhấn mạnh rằng đặc tính quan trọng của interface trong OOP là tính đa hình. Nếu dùng abstract class cho mục đích đó thì ko triệt để và không linh động như interface. Còn cái site tui đưa ra chỉ là cho những ai không hiểu đa hình là gì. Đa hình không có nghĩa là phải có function, rồi có thể truyền vào function đó nhiều instance thuộc nhiều class khác nhau, miễn là cùng interface. Cái đó chỉ là 1 context của đa hình.
@Quan Ly Thanh: lúc nào bạn cũng cứ chăm chăm vào cái ứng dụng "đa thừa kế" của interface, tôi không hề phản bác điều đó, nó cũng là 1 ứng dụng của interface, tuy nhiên interface ko phải sinh ra chỉ nhằm 1 mục đích đó. Còn bạn nghĩ rằng dùng interface và abstract class là như nhau trong đa hình thì do bạn chưa thấy tính nổi trội của interface trong design, mình thì thường dùng interface hơn là abstract class (rất hiếm khi dùng tới abstract class, trừ khi muốn có 1 vài default methods nào đó).


From: skydunkpro <skydu...@gmail.com>
Sent: 11/05/2009 11:55:46 PM +0700
To: PHPVietnam <phpvi...@googlegroups.com>
Subject: [PHPVietnam] Re: abstract và interface ???

Quan Ly Thanh

unread,
Nov 5, 2009, 7:32:40 PM11/5/09
to PHPVietnam
Viết lại = C# nha

interface Cat {}
interface Dog {}

abstract class CatDog: Cat {} // Vì chỗ này ko cho đa kế thừa
abstract class,nếu ko thì tôi dùng abstract thay vì interface ở trên

class CatDogImpl : CatDog {}

class LamThit {
public void lamthit(Dog obj) {

Console.WriteLine("run ....");
}

}

class Program
{
static void Main(string[] args)


{
Cat cat = new CatDogImpl();
LamThit obj = new LamThit();
obj.lamthit((Dog)cat);
}
}

P/S: http://mindprod.com/jgloss/interfacevsabstract.html : Có thấy đặc
điểm đầu tiên nó đưa ra là vì ko vậy ,để tôi viết luôn nhé multiple
inheritance , nếu mà nói cái này dịch ra là đa hình thì tôi thua =))
=))

On Nov 6, 12:27 am, "Nguyễn V. Hùng" <ng.hun...@gmail.com> wrote:
> Tất nhiên là tôi hiểu cái ví dụ của bạn nhằm mục đích gì (cái ví dụ của
> tôi ko rõ nghĩa bằng cái ví dụ của bạn). Tôi chỉ muốn nhấn mạnh rằng đặc
> tính quan trọng của interface trong OOP là tính đa hình. Nếu dùng
> abstract class cho mục đích đó thì ko triệt để và không linh động như
> interface. Còn cái site tui đưa ra chỉ là cho những ai không hiểu đa
> hình là gì. Đa hình không có nghĩa là phải có function, rồi có thể
> truyền vào function đó nhiều instance thuộc nhiều class khác nhau, miễn
> là cùng interface. Cái đó chỉ là 1 context của đa hình.
> @Quan Ly Thanh: lúc nào bạn cũng cứ chăm chăm vào cái ứng dụng "đa thừa
> kế" của interface, tôi không hề phản bác điều đó, nó cũng là 1 ứng dụng
> của interface, tuy nhiên interface ko phải sinh ra chỉ nhằm 1 mục đích
> đó. Còn bạn nghĩ rằng dùng interface và abstract class là như nhau trong
> đa hình thì do bạn chưa thấy tính nổi trội của interface trong design,
> mình thì thường dùng interface hơn là abstract class (rất hiếm khi dùng
> tới abstract class, trừ khi muốn có 1 vài default methods nào đó).
>

> ------------------------------------------------------------------------
> *From:* skydunkpro <skydunk...@gmail.com>
> *Sent:* 11/05/2009 11:55:46 PM +0700
> *To:* PHPVietnam <phpvi...@googlegroups.com>

Quan Ly Thanh

unread,
Nov 5, 2009, 7:35:33 PM11/5/09
to PHPVietnam
Sorry, quên cho nó implement several interfaces :)), sửa lại 1 chút

interface Cat {}
interface Dog {}

abstract class CatDog: Cat,Dog {} // Vì chỗ này ko cho đa kế thừa


class,nếu ko thì tôi dùng abstract thay vì interface ở trên

class CatDogImpl : CatDog {}

skydunkpro

unread,
Nov 5, 2009, 7:58:06 PM11/5/09
to PHPVietnam
bác viết gì tôi ko hiểu ?? bác sửa chỗ nào và như thế nào ?? bác cứ
viết lại đầy đủ !! À, và vì bác nói là abstract class làm được mọi thứ
interface làm được thì cứ coi như ko tồn tại interface !!! chỗ nào có
chữ interface bác cứ thoải mái thay = chữ gì khác mà vd của bác vẫn
giữ nguyên ý nghĩa !!

On 6 Tháng Mười Một, 07:35, Quan Ly Thanh <lythanhq...@gmail.com>

skydunkpro

unread,
Nov 5, 2009, 8:15:36 PM11/5/09
to PHPVietnam
bác viết gì tôi ko hiểu ?? bác sửa chỗ nào và như thế nào ?? bác cứ
viết lại đầy đủ !! À, và vì bác nói là abstract class làm được mọi thứ
interface làm được thì cứ coi như ko tồn tại interface !!! chỗ nào có
chữ interface bác cứ thoải mái thay = chữ gì khác mà vd của bác vẫn
giữ nguyên ý nghĩa !!

On 6 Tháng Mười Một, 07:35, Quan Ly Thanh <lythanhq...@gmail.com>

skydunkpro

unread,
Nov 5, 2009, 8:26:31 PM11/5/09
to PHPVietnam
hì hì !! Bác cười to quá, sáng sớm ngủ dậy chưa hết ngái ngủ đã nhận
được mail của bác nên chưa hiểu ý định của bác !! Như tôi đã nói, bác
cứ suy nghĩ "từ từ" mà viết nhé !! Việc tạo ra các "hình thái" khác
nhau chỗ nào làm bằng interface thì bác cứ thay = abstract class !!
"Project" này chắc sẽ tốn nhiều công sức lắm đây !! nó thuộc loại
enterprise đấy !! :P

ps: vấn đề chúng ta đang thảo luận là nếu chỉ dùng abstract class là
"triệt để" hay ko !!

> > > P/S:http://mindprod.com/jgloss/interfacevsabstract.html:Cóthấy đặc

skydunkpro

unread,
Nov 5, 2009, 8:29:56 PM11/5/09
to PHPVietnam
hì hì !! Bác cười to quá, sáng sớm ngủ dậy chưa hết ngái ngủ đã nhận
được mail của bác nên chưa hiểu ý định của bác !! Như tôi đã nói, bác
cứ suy nghĩ "từ từ" mà viết nhé !! Việc tạo ra các "hình thái" khác
nhau chỗ nào làm bằng interface thì bác cứ thay = abstract class !!
"Project" này chắc sẽ tốn nhiều công sức lắm đây !! nó thuộc loại
enterprise đấy !! :P

ps: vấn đề chúng ta đang thảo luận là nếu chỉ dùng abstract class là

"triệt để" hay ko !!

> > > P/S:http://mindprod.com/jgloss/interfacevsabstract.html:Cóthấy đặc

Quan Ly Thanh

unread,
Nov 5, 2009, 9:07:29 PM11/5/09
to PHPVietnam
Ha ha, mình đang bị gài hàng đây hả ta? Tôi ko nói là abstract class
làm dc mọi thứ của interface nhé, tôi chỉ nói abstract class xài đa
hình như interface thôi nhé.Vui lòng đọc lại mấy bài phía trên nha
Cái chỗ bác cho 1 interface extends từ 2 interface khác rồi kêu tôi
thay = abstract class thì tôi bó tay :)).
Đọc dùm mình link mình post nha :(

> ...
>
> read more »

"Nguyễn V. Hùng"

unread,
Nov 5, 2009, 9:50:15 PM11/5/09
to phpvi...@googlegroups.com
Ối giời ơi, bác ấy chỉ thấy mỗi chữ "đa thừa kế", nhìn xa tí nữa đi bác à, đến là khổ, nói đến thế còn chưa chịu hiểu hay cố tình ko muốn hiểu? Ban đầu cứ cày với cối, nào là abstract class có tính năng đa hình như interface, thế mà cái ví dụ thì lại có ngay 2 cái interface to uỳnh, rõ khổ...


From: Quan Ly Thanh <lytha...@gmail.com>
Sent: 11/06/2009 9:07:29 AM +0700
To: PHPVietnam <phpvi...@googlegroups.com>
Subject: [PHPVietnam] Re: abstract và interface ???

Khoa Nguyen

unread,
Nov 5, 2009, 9:54:51 PM11/5/09
to phpvi...@googlegroups.com
Có lẽ ngay từ đầu bác chưa hiểu kỹ polymorphism nên bác liên tục đưa đi đưa lại cái đống code xôi thịt này. Thui, mình cũng viết ra 1 đống xôi thịt khác mà thể hiện tính đa hình nè:

interface Animal {
      void cry();
}

class Cat implements Animal {
      void cry() {
            sysout("Méo méo!");
      }
}

class Dog implements Animal {
      void cry() {
            sysout("Gâu gâu!");
      }
}

void cryMeARiver(Animal[] animals) {
      for (Animal animal : animals) {
            animal.cry();
      }
}

Đa hình là ý người ta nói dzị á, hông phải là chỉ ngồi implements, extends tòe loe interfaces thì gọi là đa hình, vì đó là thừa kế. Mà thừa kế thì có thể là *đa thừa kế* hoặc *đơn thừa kế*.. Kô phải cứ OOP thì kô hỗ trợ đa thừa kế, cũng kô phải là abstract class kém linh động hơn interface. Thậm chí vì đa thừa kế (tức là nó sẽ hỗ trợ kế thừa nhiều abstract classes) nó linh động quá cho nên nó gây ra những vấn đề khác trong thiết kế (bạn tự đọc thêm), và do đó người ta mới nghĩ cách tránh đa thừa kế. Cách giải quyết của Java là đẻ ra interface để hỗ trợ multi implementation thay cho multi inheritance.

Còn muốn ví dụ minh chứng cho việc "abstract" linh động hơn "interface" thì thử ngó qua C++, Python.. xem thử nó linh động ra sao.. Để bạn khỏi đi lạc, mình quăng thêm 1 đống code C lọng cọng nè:

class DogCat: Dog, Cat {
      void cry() {
           if (buồn) {
                Cat::cry(); // Méo méo
           }
           if (vui) {
                Dog::cry(); // Gấu gấu
           }
      }
}

Ghi chú: Để mấy bác biết C++ hông có xông vào chửi mình, mình giả sử: interface mà mình nhắc đến trong C lọng cọng là class mà mọi methods là *pure virtual*. Và giả sử là Dog và Cat là abstract classes để cho đúng ngữ cảnh chửi lộn nha :))

Thấy ai linh động hơn chưa? Giả sử Dog với Cat là interfaces thì muốn viết cái lớp DogCat bạn phải làm gì? Ngồi dùng design patterns hoặc là tự ngồi lọ mọ implement lại mọi thứ. Và nhớ là ví dụ trên kô có interface nhé! Cũng nhớ thêm là vì Java đã kô hỗ trợ đa thừa kế nên kô thể làm vậy với Java nhé! Mà phải nhớ là hông phải cứ ngồi viết mấy cái implements, extends là thể hiện đa hình nhé, vì chính bạn đã nhầm nhọt đa hình và kế thừa rùi đó. Mình nhắc lại là sợ bạn đọc lướt lướt đoạn trên rùi tiếp tục viết những bài vô ích :">

2009/11/6 skydunkpro <skydu...@gmail.com>

skydunkpro

unread,
Nov 5, 2009, 10:03:42 PM11/5/09
to PHPVietnam
Không ngờ tôi lại bị cuốn vào cái thread vớ vẩn này !! Tôi chẳng gài
hàng gì bác cả, và cái link của bác tôi cũng chẳng quan tâm vì thực
chất nó đề cập đến vấn đề khi nào dùng interface hay abstract class
chứ chẳng phải multible inheritance hay polymorphism gì cả !!

Trong ví dụ của bác pcdinh hay trên wiki kia đã chỉ ra 1 context quan
trọng của đa hình là với việc nắm giữa một "hình thái" ta có thể quản
lý được nhiều loại đối tượng khác nhau được khởi tạo từ nhiều class
khác nhau miễn sao các class ấy implement interface chỉ định !! Còn
trong ví dụ của tôi là muốn chỉ ra rằng 1 đối tượng có thể mang khoác
lấy trên mình nhiều tính chất, bộ mặt, "hình thái" khác nhau, tùy
trường hợp cụ thể mà đối tượng bộc lộ tính chất nào đấy của mình.
Trong vd của tôi rõ ràng tôi đã tạo ra 1 đối tượng vừa mang bộ mặt của
Cat vừa có thể là Dog !! Và đó là điều đó "abstract class" không thể
làm triệt để !!

phân biệt:
- 1 hình thái được hỗ trợ bởi nhiều loại đối tượng
- 1 loại đối tượng mang khoác nhiều hình thái

Chính xác rằng khả năng multible inheritance của interface (mà thực
chất là "đa thừa kế hình thái") đã khiến cho tính đa hình linh hoạt.
Việc ta có thể thoải mái tạo ra một hình thái mới chỉ cần đơn giản
bằng cách cấy ghép từ các hình thái sẵn có từ 1 nhánh hay nhiều nhánh
của nhiều loại khác nhau tạo ra tính đa bộ mặt , đa hình cho đối
tượng, hay 1 nhóm các đối tượng. Và với việc 1 class có thể implements
nhiều interface khác nhau khiến cho đối tượng càng ko gò bó và thoải
mái khi giao tiếp với những đối tượng khác. Đấy mới là thứ tôi muốn
nói !!

Vâng nó đơn giản, và cực kì căn bản, làm cho tôi đã quá chủ quan khi
viết bài post đầu tiên với quá ít code !! Còn bác nào nói 1 đối tượng
có thể "thoải mái" mang nhiều hình thái khác nhau là không phải là
tính "đa hình" mà là "đa thừa kế" thì tôi không đỡ nổi !! đúng như bác
Khoa nói, chúng ta thảo luận là vô ích !!

to None: bây giờ tôi mới thấy bài post của bác !! mặc dù cố gắng
"thiện cảm" hóa, nhưng phải công nhận bác rất thành công khi làm tôi
hơi "cáu" !! Tôi rất ghét những mẩu chuyện châm biếm của những "kẻ
không có đầu óc". Bác và thằng bạn ghẻ ghẻ của bác nếu cảm thấy mình
vô tích sự thì tốt nhất là nên "im lặng", nếu có thắc mắc thì đặt câu
hỏi. Việc chọc ngoáy không đúng chỗ, đúng lúc, và đúng người chỉ làm
bác trông càng "ghẻ" hơn trong mắt người khác!

to All: nếu là thứ gì khác thì hi vọng tôi còn có hứng thú ngồi cà
khịa với các bác, còn cái thứ này ở chỗ tôi nếu lạm bàn thì được ném
vào loại "spammer" cấp độ 1 !! thật haizz ...

ps: cái thread này thật sự khiến tôi quá chán nản, sức khỏe có giới
hạn, tôi chỉ viết đến thế thôi, còn vd của bác Khoa tôi sẽ có gắng ghi
nhớ !!


On 6 Tháng Mười Một, 09:07, Quan Ly Thanh <lythanhq...@gmail.com>
wrote:

instcode

unread,
Nov 5, 2009, 10:21:14 PM11/5/09
to PHPVietnam
Ví dụ về tính đa hình của bác, có ai ví dụ về "polymorphism" mà cứ
ngồi implements rùi extends khơi khơi mà kô hề nhắc đến mấy method ghẻ
của nó kô? Bác cũng biết khi implements nhiều interface thì gọi là
"multiple implementation **inheritance**" rùi mà bắt người ta gọi đó
là "đa hình" (bằng cách chơi chữ: "đa kế thừa hình thái") là sao?
Người ta dạy hay viết sách cho bác đọc về tính đa hình có ai ngồi viết
mấy cái kế thừa khơi khơi đó kô?

Mà lại chê "abstract class" nữa rùi :( Thui mệt quá, đọc lướt lướt rùi
lại tự ngồi nói những cái mà ai cũng biết ra hoài :|
Nhắc lần cuối nè: Bạn chê "abstract class" thì đi học C++ hay Python
đi rùi biết, để Java sang một bên đi :@ Rùi coi thử ai linh động hơn.

Tui mới chán bác á :(

Giang Nguyen Hoang Duc

unread,
Nov 5, 2009, 11:20:57 PM11/5/09
to PHPVietnam
@skydunkpro: tôi hiểu bác đang cố thảo luận nghiêm túc, tôi cũng hiểu
ý của bác qua bài viết vừa rồi. Phải chi ngay từ đầu bác viết như thế.
Sorry vì hiểu nhầm.
@inscode: bác ấy chẳng chơi chữ gì đâu, chỉ là làm rõ nghĩa hơn tính
đa thừa kế trong OOP mà thôi. Bác lấy ví dụ của C++ trong trường hợp
này theo tôi là không hợp lý vì C++ không thuần OOP.

Thực chất đây là điều ai cũng hiểu nhưng không có một phân tích cặn kẽ
như bài viết vừa rồi của skydunkpro. Dù gì thì chữ "hình thái" mặc dù
nghe lạ tai nhưng cũng đỡ hơn là chữ"giao diện" khi dịch từ
interface :))

Viet Q

unread,
Nov 5, 2009, 11:04:10 PM11/5/09
to phpvi...@googlegroups.com
Abstract hay Interface cùng mục đích tạo sự linh hoạt cho đối tượng khi sử dụng. Code ra thì ngẫm ra thôi chứ cãi nhau làm gì, định nghĩa chỉ là giúp cho người chưa hiểu và cần hiểu để code thôi.

Mỗi ngôn ngữ đôi khi implements một kiểu, ràng buộc một kiểu, cái cối cãi cái chày nên đôi lúc lệch lạc mà không giải quyết đc cái gì.

(May mà tui dùng gmail chứ không dùng yahoo, không thì đọc webmail loạn mất)
2009/11/6 instcode <inst...@gmail.com>



--
Best regards,
---VQV---

Khoa Nguyen

unread,
Nov 6, 2009, 1:39:45 AM11/6/09
to phpvi...@googlegroups.com
:)) Xem ra công mình tương trợ là công cốc, cũng như công mình ngồi gõ loạn xạ ra cho rõ vấn đề là công chùa :))

Kô biết bác ni hiểu thế nào là Pure OOP :)) Pure OOP là hông cho đa kế thừa à :)) Bác có biết Java là kô Pure OO language hông? :))

Té ra hôm bữa mình đọc 2 bài, 1 bài của GNHD nói về sao "kô thấy function", và bài sau của bác Kai nói về "đa hình thì phải có function" mình tưởng nhầm là họ đã ngộ ra được cái "function" (sao giống đang nói về functional programming language) là cái operator của class chớ :)).. Giờ lại hùa theo là "mutil implementation inheritance" là "đa kế thừa hình thái" hay gọi là "nhiều hình thái" nữa :))

Quên, lại còn người lên mắng "code là để ngẫm thôi" :)) Vậy sao từ đầu ông sky gì đó post 1 bãi code ghẻ lên (và đó là dấu hiệu cho thấy kiến thức về đa hình của ổng còn hổng nhiêu chỗ) rùi cười cạch cạch bảo đó là "đa hình nè mấy ku" thì ông này lại kô chịu nhảy vào mắng: "code là để ngẫm thôi" ku :))

Tui thiệt là bó tay zới mí pạn lun rùi á :)) Còn kêu mình chày cối nữa =(( Chắc bữa sau nói gì phải cite từng dòng trong sách mình đã học ra quá =((

Thui nói tới đây tui nghĩ ai hiểu interface, abstract, class, inheritance, polymorphism thì cũng đã hiểu rùi :)) Ai chưa hiểu thì chắc có nói thêm cũng ko bao giờ hiểu đâu :)) Tốt nhất là tui câm họng lại kô thôi nói nói hoài, có gì sai thì có người sẽ dzô bọp cổ ngay :)) Sao thấy mình cô đơn trên mạng quá none =((

P/S: Tui là đứa bạn ghẻ ghẻ của thằng none ở trên á mí bác =)) Và sau bài này là tui chỉ dzô thread nói chuyện hài thôi, ko có kỹ thuật nữa :))

2009/11/6 Giang Nguyen Hoang Duc <giang.nguy...@gmail.com>

instcode

unread,
Nov 6, 2009, 1:50:55 AM11/6/09
to PHPVietnam
Quên, nhiều khi có mí bác tưởng thằng instcode nào ghẻ ghẻ nào tự
nhiên nhảy dzô chọt 1 câu mà ko biết là *thằng Khoa Nguyên và thằng
instcode là một* :)) Giống bé KENT hồi xưa, chửi một hồi đêk biết
thằng instcode và thằng Khoa Nguyen là thằng nào :))

Cho nêm em spam bài này với lời nhắn: Em tên Khoa, họ Nguyễn, nguyên
hiệu instcode, tất cả là em đó, em hông có rảnh để nhảy dzô quăng chày
quăng cối lung tung nha mí bác :))

On Nov 6, 2:39 pm, Khoa Nguyen <instc...@gmail.com> wrote:
> :)) Xem ra công mình tương trợ là công cốc, cũng như công mình ngồi gõ loạn
> xạ ra cho rõ vấn đề là công chùa :))
>
> Kô biết bác ni hiểu thế nào là Pure OOP :)) Pure OOP là hông cho đa kế thừa
> à :)) Bác có biết Java là kô Pure OO language hông? :))
>
> Té ra hôm bữa mình đọc 2 bài, 1 bài của GNHD nói về sao "kô thấy function",
> và bài sau của bác Kai nói về "đa hình thì phải có function" mình tưởng nhầm
> là họ đã ngộ ra được cái "function" (sao giống đang nói về functional
> programming language) là cái operator của class chớ :)).. Giờ lại hùa theo
> là "mutil implementation inheritance" là "đa kế thừa hình thái" hay gọi là
> "nhiều hình thái" nữa :))
>
> Quên, lại còn người lên mắng "code là để ngẫm thôi" :)) Vậy sao từ đầu ông
> sky gì đó post 1 bãi code ghẻ lên (và đó là dấu hiệu cho thấy kiến thức về
> đa hình của ổng còn hổng nhiêu chỗ) rùi cười cạch cạch bảo đó là "đa hình nè
> mấy ku" thì ông này lại kô chịu nhảy vào mắng: "code là để ngẫm thôi" ku :))
>
> Tui thiệt là bó tay zới mí pạn lun rùi á :)) Còn kêu mình chày cối nữa =((
> Chắc bữa sau nói gì phải cite từng dòng trong sách mình đã học ra quá =((
>
> Thui nói tới đây tui nghĩ ai hiểu interface, abstract, class, inheritance,
> polymorphism thì cũng đã hiểu rùi :)) Ai chưa hiểu thì chắc có nói thêm cũng
> ko bao giờ hiểu đâu :)) Tốt nhất là tui câm họng lại kô thôi nói nói hoài,
> có gì sai thì có người sẽ dzô bọp cổ ngay :)) Sao thấy mình cô đơn trên mạng
> quá none =((
>
> P/S: Tui là đứa bạn ghẻ ghẻ của thằng none ở trên á mí bác =)) Và sau bài
> này là tui chỉ dzô thread nói chuyện hài thôi, ko có kỹ thuật nữa :))
>

> 2009/11/6 Giang Nguyen Hoang Duc <giang.nguyenhoang...@gmail.com>

son 8x

unread,
Nov 6, 2009, 4:14:41 AM11/6/09
to PHPVietnam
hic, các bác cãi nhau kinh quá :(
có ai giải thích cho em đoạn sau ko ???

trong bài viết của bác pcdinh có đoạn code:

/
*************************************************************************/
class SecurityStaff
{
public function check(GuestRequirement $guest)
{
if (empty($guest->getPassport()))
{
throw new Exception('Passport phải mang theo');
}

if (false === $this->hasAppointment($guest->getName()))
{
throw new Exception('No appointment ');
}
}
}

*************************************************************************/

Em thắc mắc ở chỗ:
/**********************************************************
public function check(GuestRequirement $guest)
**********************************************************/
sao lại có GuestRequirement trong fuction check ???

lamvnvc

unread,
Nov 6, 2009, 4:44:52 AM11/6/09
to PHPVietnam
Ví dụ:

$guestObj = new GuestRequirement();

$securityObj = new SecurityStaff();

$securityObj->check($guestObj);

public function check(GuestRequirement $guest){}

Trong đó "GuestRequirement $guest" chỉ ra rằng $guest có dữ liệu kiểu
GuestRequirement (không phải kiểu int hay array,...).

Lớp SecurityStaff có thể viết chuẩn hơn như sau:

class SecurityStaff
{
public function check(GuestRequirement $guest)
{
if (!($guest instanceof GuestRequirement)) {
throw new Exception("Thông báo lỗi");

son 8x

unread,
Nov 6, 2009, 8:29:21 AM11/6/09
to PHPVietnam
/
************************************************************************
"GuestRequirement $guest" chỉ ra rằng $guest có dữ liệu kiểu
GuestRequirement (không phải kiểu int hay array,...).
************************************************************************/
Bác giải thích rõ hơn được ko ạ ??? em vẫn chưa hiểu :(

son 8x

unread,
Nov 9, 2009, 11:26:13 PM11/9/09
to PHPVietnam
có bác nào giải thích đc ko ạ ???
Reply all
Reply to author
Forward
0 new messages