こんにちは。
以下のプログラムにおいて、
Animal a = new Cat();として変数aはCat型となるのでしょうか?
変数aにはCatがはいる?(はいるんでしょうね。きっと)
イメージとして
変数aの型(Animal型)より、派生したCAT型のほうが(箱)が大きいと思われるのに
a=Cat型となるのでしょうか?
(上記のイメージで
派生クラスのオブジェクトは基底クラスの変数に代入できることがわかりません。)
分かっていること。
Cat型はAnimal型として振る舞える。
代入後は、変数の型 (= Animal) が呼び出される。
猫 (Cat)は動物(Animal)の一種である。
Catクラスは 動物(Animal)クラスから派生している。
参考にしたページ
https://csharp.keicode.com/basic/as-operator.php
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace catdog
{
class Program
{
static void Main(string[] args)
{
Animal a = new Cat();
a.test();
}
}
class Animal
{
public void test()
{
Console.WriteLine("test");
}
}
class Dog : Animal
{
}
class Cat : Animal
{
}
}
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
基底クラス=大分類
派生クラス=小分類
のようなイメージを持てばいいかと思います。
Animal a = new Cat();
の場合、「a」はAnimalとして振る舞う。
aとCatとして扱う場合は(Cat)a などとしてキャストすることでCatとして扱うこともできる。
下記のように活用します。
Animal a = new Cat();
string animalColor = a.getColor(); //動物の色を取得するメソッドがあるとする
if(a is Cat){ //aがCatクラスなら
Cat cat = a as Cat;
cat.huntMouse(); //ネズミを捕らえるメソッドがあるとする
}
if(a is Dog){ //aがCatクラスなら
Dog dog = a as Dog;
dog.longRun(); //走り回るメソッドがあるとする
}
No.3
- 回答日時:
うーん、まず抽象化を何のために行うか考えたほうが良いでしょう。
Animal型の参照のみを使って行う処理、つまり Cat型であることを知らず
Animal型で使えるメンバ範囲のみを使って行う処理は、Cat型のオブジェクトでも
Dog型のオブジェクトでも動きます。
新たに、Fox型がAnimalを継承して新設されても Animal型の範囲のみで処理を行っている
処理はおそらく全く変更する必要がないし、その処理は Catでも DogでもFoxでも使える
共通処理として使えでしょう。
でも、CatやDog型のオブジェクトの参照がAnimal型と互換性がなければ
そういうことは全くできません。
なので、それができるように言語が実装されているのです。
オブジェクトの共通性からの抽象化と、上位レベルからの処理の共通化は、
オブジェクト指向の基本の一つです。
No.2
- 回答日時:
変数の型とオブジェクトの型は違います。
変数はAnimal型で、オブジェクトがCat型です。
あとこういうオブジェクト変数の型は普通は参照型で、変数に直接オブジェクトの実体を入れるのではなく、オブジェクトはヒープ領域に作られて変数にはその参照(ポインタ)のみが保管されるように実装されます。参照は一般にどの型のオブジェクトでも同じ大きさなので実体が大きくなる下位型のオブジェクトでも問題なく代入できます。
ご回答ありがとうございます。
メモリ内部の話ありがとうございます。
大変さんこうになりました。
でも、わかりませんw
たとえば、アップキャスト
派生クラスは基底クラスの機能をすべてもっているので
基底クラスとしてふるまうことができる。
これは、理にかなっており、Animalクラスの中に書かれているメンバとかメソッドとかは覗けるけど、Catクラス(型)は覗くことはできない。
要するに、Animal型の範囲しか見れないということです。
(↑えらそう ごめんなさい)
Cat型はみれてないじゃん。 ってことです。
上記の理由によりAnimal a = new Cat(); が
Animal型の変数aがCaT型(a=Cat)をしめせるのかがわかりません。
このプログラムにおける継承関係は動物→猫(犬)となってます。
たとえば、猫は動物の一種である。
動物の一種に猫がいる。じゃぁ猫(Cat)が入るじゃないですか。
動物から継承しているので、この式が成り立つ(代入できる)といわれれば
そうかもしれませんが・・・
ちょっとおればかなのかなぁ?
No.1
- 回答日時:
> Animal a = new Cat();として変数aはCat型となるのでしょうか?
> 変数aにはCatがはいる?
型はGetType()メソッドで確認できます。
Animal a = new Cat();
Console.WriteLine(a.GetType()); //-> catdog.Cat
a = (Animal)(new Cat());
Console.WriteLine(a.GetType()); //-> catdog.Cat
Animal型変数aは、Animal型から派生したCat型オブジェクトを参照できます。(アップキャスト)
> イメージとして変数aの型(Animal型)より、派生したCAT型のほうが(箱)が大きいと思われる
これについては以前のご質問でも回答していますので参照してください。
https://oshiete.goo.ne.jp/qa/10986235.html の回答No.5
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Ruby パイソンのクラスについて 3 2023/06/20 07:30
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
- 電子レンジ・オーブン・トースター アラジン トースター(2枚焼き)でおススメあります? 2 2023/03/26 08:43
- 英語 The dog is not the noble animal in Spain that it i 2 2022/06/30 21:54
- UNIX・Linux AWSのEC2のZabbixユーザーでawscliコマンドが実行できない状態を解決する 1 2022/12/06 22:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
パワーポイントのVBAでテキスト...
-
CoCreateInstanceでエラーになる。
-
複数TBLのオブジェクトを1つの...
-
Excelで =EMBED("Acrobat Docu...
-
オブジェクトと関数の違い
-
ADO オブジェクトの渡し方
-
EXCEL VBAにて動的にCheckBOXを...
-
VBA 同じ名前のオブジェクトを...
-
JAVAからHTMLへ値を返す方法
-
XAMLの動的生成について
-
CFileDialogでフォルダだけを選...
-
bmp画像をjpegやpng画像に圧縮...
-
ASP.net 教えてください!!(...
-
C# Proxyを通してブラウザを開...
-
COMコンポーネントって何?
-
VBSでのステートメントの末尾が...
-
BufferedWriterのcloseメソッド
-
Excelファイルをgrep検索したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報