クラスは参照渡し。
 クラスは参照渡しなのでしょうか 値渡しなのでしょうか 確認してみよう
| 
class Animal
{
 private char[] name;
 this(){name ="Poti";}
 this(char[] name)
 {
 setName(name);
 }
 void setName( char[] name)
 {
     int length = name.length;
     this.name.length = length;
     this.name[0..length] = name[0..length];
 }
 void printName()
 {
 printf(name);
 printf("\n");
 }
}
 | int main() { Animal poti = new Animal("poti"); Animal taro = new Animal("taro"); poti.printName(); taro.printName(); taro = poti; taro.setName("matu"); poti.printName(); taro.printName(); return 0; } | 
ということで 参照渡しです。
OverrideとVirtual
 親と子の関係
| 
class Animal
{
 public void giveBark(){
   printf("pyoro pyoro pyoro");
   printf("\n\n");
 }
}
 | 
class Dog : Animal
{
 public void giveBark(){
  printf("Wan Wan Wan");
  printf("\n\n");
 }
}
       | 
int main()
{
Animal Uma = new Animal();
Uma.giveBark();
Uma= new Dog(); 
Uma.giveBark();
return 0;
}
 | 
newUMA newDog Uma pyoro WanWan Dog noCheck WanWan
| 
class Animal
{
  public  void giveBark(){
  Barking();
 }
   private void Barking(){
   printf("pyoro pyoro pyoro");
   printf("\n\n");
 }
}
 | 
class Dog : Animal
{s
/*
  public void giveBark(){
  Barking();
  }
*/
  private void Barking(){
  printf("Wan Wan Wan");
  printf("\n\n");
 }
}
       | 
int main()
{
Animal uma = new Animal();
Dog    dog = new Dog();
uma.giveBark();
dog.giveBark();
uma= new Dog(); 
uma.giveBark();
return 0;
}
 | 
newUMA newDog Uma pyoro pyoro Dog noCheck pyoro
| 
class Animal
{
  public  void giveBark(){
  Barking();
 }
   private void Barking(){
   printf("pyoro pyoro pyoro");
   printf("\n\n");
 }
}
 | 
class Dog : Animal
{
  public void giveBark(){
  Barking();
  }
  private void Barking(){
  printf("Wan Wan Wan");
  printf("\n\n");
 }
}
       | 
int main()
{
Animal uma = new Animal();
Dog    dog = new Dog();
uma.giveBark();
dog.giveBark();
uma= new Dog(); 
uma.giveBark();
return 0;
}
 | 
newUMA newDog Uma pyoro WanWan Dog noCheck WanWan
public をprivateでoverrideしてみました。 この使い方は駄目なような気がしますが どうなのだろう。
| 
class Animal
{
  public  void giveBark(){
  Barking();
 }
   private void Barking(){
   printf("pyoro pyoro pyoro");
   printf("\n\n");
 }
}
 | 
class Dog : Animal
{
  private void giveBark(){
  Barking();
  }
  private void Barking(){
  printf("Wan Wan Wan");
  printf("\n\n");
 }
}
       | 
int main()
{
Animal uma = new Animal();
Dog    dog = new Dog();
uma.giveBark();
dog.giveBark();
uma= new Dog(); 
uma.giveBark();
return 0;
}
 | 
newUMA newDog Uma pyoro pyoro Dog nocheck WanWanUmaはpyoro pyoro pyoro Dogは"WanWanWan"と吠えます。
キャストはどうなるのだろう
 親と子の関係
C言語風キャストは (value) D言語風 は cast(Object)
| 
class Animal
{
  public  void giveBark(){
  Barking();
 }
   private void Barking(){
   printf("pyoro pyoro pyoro");
   printf("\n\n");
 }
} | 
class Dog : Animal
{
  private void giveBark(){
  Barking();
  }
  private void Barking(){
  printf("Wan Wan Wan");
  printf("\n\n");
 }
}
       | int main()
{
Animal uma = new Animal();
Animal dog = new Dog();
try{
uma.printName();
(cast(Dog)uma).giveBark();
}catch(Exception e){
 printf("can't upcast");
 printf("\n\n");
}
dog.printName();
(cast(Dog)dog).giveBark();
return 0;
}
 | 
Upキャストは注意が必要。
あと、overrideしたくないときはどうすればよいのだろうか
戻る