父類:
class Animal
{
private string name;
private int age;
private char gender;
//公有的屬性是可以被繼承的
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public int Age
{
get
{
return age;
}
set
{
age = value;
}
}
public char Gender
{
get
{
return gender;
}
set
{
gender = value;
}
}
//子類在繼承父類的時候 父類中的無參構造一定要顯示的寫出來 因為在執行個體化子類的時候
//在父類中為什麼要顯示的寫出來無參構造?
//在類中如果出現了構造方法 那麼就會把隐式的無參構造給覆寫掉
public Animal()
{
}
//構造方法是不能被繼承的
//所有公有的方法是可以被繼承的 說法是錯誤的
//因為構造方法不可以被繼承
public Animal(string name, int age, char gender)
{
this.name = name;
this.age = age;
this.gender = gender;
}
//公有的方法可以被繼承
public override string ToString()
{
return string.Format("名字:{0},年齡{1},性别:{2}", Name, Age, Gender);
}
}
子類1:
//class 子類:父類{} 這樣就形成了繼承關系
class Cat:Animal
{
public Cat()
{
}
public Cat(string name)
{
this.Name = name;
}
//base 維系了父子類之間的繼承關系
public Cat(string name, int age, char gender):base(name, age, gender)
{
}
}
子類2:
class Dog:Animal
{
public Dog()//無參構造
{
}
public Dog(string name, int age, char gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
}
主程測試:
static void Main(string[] args)
{
Animal[] animals = new Animal[];
animals[] = new Dog("小黑",,'公');
animals[] = new Cat("小白", , '母');
animals[] = new Dog("小灰", , '母');
animals[] = new Cat("小花", , '公');
animals[] = new Dog("小純", , '母');
for (int i = ; i < animals.Length; i++)
{
//is 關鍵字
//is不會将對象直接進行轉化 會在轉化之前 進行一次判斷 如果類型比對則傳回true
//類型不比對 則傳回false 然後需要根據傳回值進行适當操作
bool ret = animals[i] is Dog;
if (ret)
{
((Dog)animals[i]).Bark();
}
else
{
((Cat)animals[i]).Bark();
}
//as 關鍵字
//as 可以将animals[i]直接轉化 轉化成功 傳回一個Dog執行個體 否則傳回null
//Dog dog = animals[i] as Dog;
//if (dog != null)
//{
// dog.Bark();
//}
//Cat cat = animals[i] as Cat;
//if (cat != null)
//{
// cat.Bark();
//}
}
}