一
兩條理解的原則
(
//c++ code
BaseClass *p;
DerivedClass obj;
p = &obj;
//C# code
BaseClass obj = new DerivedClass()
(
Shape是基類
// Java Code
static void func(Shape s)
{
s
}
如果發生了這樣的調用
Line l = new Line()
Circle c = new Circle()
func(l)
func( c)
一個Circle和一個Line被當做Shape傳到函數裡去了
通過這兩條原則我們可以理解上面的多態
IF 你是一個Circle THEN 調用Circle的Draw()
ELSE IF 你是一個Line THEN 調用Line的Draw()
ELSE …
我們只要給這個被聲明成為Shape的對象發送Draw消息
二
先看看實現多態的基本條件
(
(
(
再看一下幾種語言裡一些特別的規定
(
(
(
(
(
(
//Java Code
class BaseClass
{
public void hello(){};
}
class DerivedClass extends BaseClass
{
public void hello()
{
System
}
public static void main(String args[])
{
BaseClass obj = new DerivedClass()
obj
}
}
輸入是Hello world!
(
//Java Code
public abstract AbstractClass
{
public abstract void hello()
//…
}
C#對於多態的編寫是最為嚴格和嚴謹的
(
(
(
//C# Code
public class BaseClass
{
public void hello()
{
System
}
}
public class DerivedClass : BaseClass
{
public new void hello()
{
System
}
public static void Main()
{
BaseClass obj = new DerivedClass()
obj
}
}
輸出為Hello
(
當派生類重新實現基類的虛函數(或純虛函數)時
//C# Code
public abstract class AbsBaseClass
{
public abstract void hello()
}
public class DerivedClass : AbsBaseClass
{
public void hello()
{
System
}
public static void SayHello(AbsBaseClass obj)
{
obj
}
public static void Main()
{
DerivedClass _obj = new DerivedClass()
DerivedClass
}
}
輸出為Hello world!
三
繼承類對象在發生多態時
讓我們來看一個比較復雜的例子
// Java Code
class A
{
protected void hello(Object o)
{
System
}
}
class B extends A
{
protected void hello(String s)
{
System
}
protected void hello(Object o)
{
System
}
};
class C
{
public static void main(String args[])
{
Object obj = new Object()
String str =
A a = new B()
a
a
}
};
輸出結果為
B – Object
B – Object
正如上面所說的
四
接口是類的協定
// Java Code
interface IBase
{
void hello()
}
class DerivedClass implements IBase
{
public void hello()
{
System
}
public static void main(String args[])
{
IBase obj = new DerivedClass()
obj
}
}
在Java與C#中
這裡有一個小小的問題
interface IBase
{
void hello()
}
interface IBase
{
void hello()
}
public class DerivedClass
{
public void hello()
{
System
}
}
public class DerivedClass
{
void IBase
{
System
}
void IBase
{
System
}
public static void Main()
{
IBase
IBase
IBase
IBase
obj_
obj_
obj_
obj_
}
}
輸出為
Hello world!
Hello world!;
This come from IBase
This come from IBase
有兩點注意
加入這樣的代碼
DerivedClass
t
編譯錯誤
那就是說這個方法是屬於接口的
From:http://tw.wingwit.com/Article/program/net/201311/12588.html