◎11月20日 D言語"クラスを使ってみる"
virtualとoverrideまで

クラスは参照渡し。
 クラスは参照渡しなのでしょうか 値渡しなのでしょうか 確認してみよう

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
 親と子の関係

◎publicで宣言すると 必ず virtual になります。 そして 同じ名前があると overrideします
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

◎private と static は virtualではないです。 
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で 上書きする?

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    WanWan
Umaは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したくないときはどうすればよいのだろうか
戻る

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!