痔になりやすい生活習慣とは?

こんにちは。

以下のプログラムにおいて、
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件)

基底クラス=大分類


派生クラス=小分類
のようなイメージを持てばいいかと思います。

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(); //走り回るメソッドがあるとする
}
    • good
    • 0

うーん、まず抽象化を何のために行うか考えたほうが良いでしょう。



Animal型の参照のみを使って行う処理、つまり Cat型であることを知らず
Animal型で使えるメンバ範囲のみを使って行う処理は、Cat型のオブジェクトでも
Dog型のオブジェクトでも動きます。

新たに、Fox型がAnimalを継承して新設されても Animal型の範囲のみで処理を行っている
処理はおそらく全く変更する必要がないし、その処理は Catでも DogでもFoxでも使える
共通処理として使えでしょう。

でも、CatやDog型のオブジェクトの参照がAnimal型と互換性がなければ
そういうことは全くできません。

なので、それができるように言語が実装されているのです。

オブジェクトの共通性からの抽象化と、上位レベルからの処理の共通化は、
オブジェクト指向の基本の一つです。
    • good
    • 0

変数の型とオブジェクトの型は違います。


変数はAnimal型で、オブジェクトがCat型です。
あとこういうオブジェクト変数の型は普通は参照型で、変数に直接オブジェクトの実体を入れるのではなく、オブジェクトはヒープ領域に作られて変数にはその参照(ポインタ)のみが保管されるように実装されます。参照は一般にどの型のオブジェクトでも同じ大きさなので実体が大きくなる下位型のオブジェクトでも問題なく代入できます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

メモリ内部の話ありがとうございます。
大変さんこうになりました。

でも、わかりませんw

たとえば、アップキャスト
派生クラスは基底クラスの機能をすべてもっているので
基底クラスとしてふるまうことができる。

これは、理にかなっており、Animalクラスの中に書かれているメンバとかメソッドとかは覗けるけど、Catクラス(型)は覗くことはできない。
要するに、Animal型の範囲しか見れないということです。
(↑えらそう ごめんなさい)

Cat型はみれてないじゃん。 ってことです。

上記の理由によりAnimal a = new Cat(); が
Animal型の変数aがCaT型(a=Cat)をしめせるのかがわかりません。

このプログラムにおける継承関係は動物→猫(犬)となってます。
たとえば、猫は動物の一種である。
動物の一種に猫がいる。じゃぁ猫(Cat)が入るじゃないですか。
動物から継承しているので、この式が成り立つ(代入できる)といわれれば
そうかもしれませんが・・・

ちょっとおればかなのかなぁ?

お礼日時:2019/03/22 19:54

> 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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qスーパーハッカーやホワイトハッカーが未だにプログラムをキーボードを使ってアナログな入力を10年前と変

スーパーハッカーやホワイトハッカーが未だにプログラムをキーボードを使ってアナログな入力を10年前と変わらずに未だにガチガチキーパンチャーしてるのって一般人から見たら超絶ダサいらしいですよ。

マツコデラックスがスーパーハッカーがプログラムをキーボードで打っていたのを見て「まだキーボードで打ってるんだ。人工知能や音声を文字化出来るようになってるのに10年前と変わらずキーボードで打ってるの?!」と言っていましたが、本当にそうだなと思いました。

未だにキーボードでプログラミングしてるって古くさいというか自動化、自動化と言ってる割にプログラマーが1番アナログだったりして。

Aベストアンサー

それは普通の文章入力しか想像できない人の発想ですね。

プログラミング言語では記号を多用しますが、これをいちいちダブルコーテーションだのアットマークだの言うのは手間だし、実は記号じゃなくてダブルコーテーションは”じゃなくそのままダブルコーテーションっていう文字列にしたかったんだけど…みたいな区別に困ることもあります。その辺をきれいに解決する手段が今のところないってこと、また「キーボード入力の方が話すよりも速くてしかも正確に入力できる」と言う事実があること、またいちいち口に出すと言うことは意外に労力を要すること、といった事情から音声認識でどうにかしようという空気にならないのでしょう。

QC++を本で独学してますが、配列とポインタでわからないところがあります。

現在C++を本で独学しており、ポインタの章を終えて配列の章を
学んでいるのですがでわからないところがあります。

『配列名は配列の先頭要素のアドレスをあらわす。』と習ったのですが、
下記のコードにての

#include <iostream>
using namespace std;

int main()
{
char str[] = "Hello";
cout << str << '/\';
return 0;
}

を実行すると"Hello"が出力されるとのことですが、
どうしてchar型配列strの要素をそのまま出力することになるのでしょうか?
この場合、『配列名は配列の先頭要素のアドレスをあらわす。』に
のっとれば出力されるのは「char型配列strの先頭要素のアドレス」に
なり、アドレスが出力されなければおかしいと思うのですが・・・?

同様に

#include <iostream>
using namespace std;

int main()
{
char* char = "Hello";
cout << str << '/\';
return 0;
}

のコードでもどうして間接参照演算子*さえ使わずに
strの要素を出力できるのかがさっぱりわかりません。

ご説明頂ければ幸いです。

現在C++を本で独学しており、ポインタの章を終えて配列の章を
学んでいるのですがでわからないところがあります。

『配列名は配列の先頭要素のアドレスをあらわす。』と習ったのですが、
下記のコードにての

#include <iostream>
using namespace std;

int main()
{
char str[] = "Hello";
cout << str << '/\';
return 0;
}

を実行すると"Hello"が出力されるとのことですが、
どうしてchar型配列strの要素をそのまま出力することになるのでしょうか?
この場合、『配列名は配列の先頭要素...続きを読む

Aベストアンサー

cout の << は。その後の型によって何を表示するかが変わります。
このような仕組をポリモーフィズムと言って、C++の重要な仕組の一つです。


他のポインタだと、そのアドレスを出力する、となっています。
対して、 char * だと「その示すアドレスから順番に、'\0'の前までの『文字』を出力する」となっています。

これは、以下のような理由があります。
・C++の元になったC言語では、「文字列型」というものが無く、「charの配列の先頭から'\0'の前までを文字列として扱う」というルールを使っている。
C++でも、そのルールを引き継いで、char * / char[] を文字列として扱うケースが多い。
・cout << にchar * を指定したとき、圧倒的に「文字列を出力したい」ケースが多い


アドレスを出力させたいのなら、char *でないポインタにキャストすることです。
そういう時は、汎用につかえる void * にキャストするのが常套手段です。

C言語由来の記法では (void * ) str と、(型)とします。
ですが、このキャストはなんでも有りすぎるので、C++ではC++専用のキャスト方法が用意されているので、そちらを使いましょう。
static_cast<void *>(str)

cout の << は。その後の型によって何を表示するかが変わります。
このような仕組をポリモーフィズムと言って、C++の重要な仕組の一つです。


他のポインタだと、そのアドレスを出力する、となっています。
対して、 char * だと「その示すアドレスから順番に、'\0'の前までの『文字』を出力する」となっています。

これは、以下のような理由があります。
・C++の元になったC言語では、「文字列型」というものが無く、「charの配列の先頭から'\0'の前までを文字列として扱う」というルールを使っている。
C++で...続きを読む

QC# ジェネリックについて

こんにちは。

ジェネリックについて教えてください。

インスタンスの作成部分において

player a = new player();
Player型の変数aのなかにPlayerクラスのインスタンスを代入という認識

player<int> a = new player<int>();
右辺:Playeクラスのインスタンスのなかに定義されている中身がInt型となる?
   (この場合ValueがINT型)
左辺:player<int> aの <int>って何ですか?
    変数aはPLAYER型ではなくInt型になるのでしょうか?

宜しくお願いいたします。
----------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ジェネリック
{
class Program
{
static void Main(string[] args)
{
player<int> a = new player<int>();
a.value = 2;
Console.WriteLine(a.value);
}
}
class player <t>
{
public t value;
}
}

こんにちは。

ジェネリックについて教えてください。

インスタンスの作成部分において

player a = new player();
Player型の変数aのなかにPlayerクラスのインスタンスを代入という認識

player<int> a = new player<int>();
右辺:Playeクラスのインスタンスのなかに定義されている中身がInt型となる?
   (この場合ValueがINT型)
左辺:player<int> aの <int>って何ですか?
    変数aはPLAYER型ではなくInt型になるのでしょうか?

宜しくお願いいたします。
-----------------...続きを読む

Aベストアンサー

>Playeクラスのインスタンスのなかに定義されている中身がInt型となる?
そうです

>player<int> aの <int>って何ですか?
>変数aはPLAYER型ではなくInt型になるのでしょうか?
playerの定義にある<t>という部分を明示的に型を指定しています
なので言葉で表すとするなら

Int型を指定されたplayerという名前のジェネリッククラスです

QC#について質問【複数の.datファイルからデータを取得後csvファイルでリストを作成】

いつもお世話になります。
複数の.datファイル(カンマ区切りの4~5列、約800行程度)
ProcessData,LOT_ID,3,AP0076686.00C,
ProcessData,LOT_ID_SUB,3,AP0076686.00,
ProcessData,LOT_NO,3,AP0076686,
ProcessData,WAFER_ID,3,AP0076686.19,
ProcessData,WAFER_NO,1,19,
ProcessData,PRODSPEC_ID,3,T5DH20001-00001.00,
ProcessData,PRODGRP_ID,3,T5DH2,
ProcessData,PRODGRP_BIND,3,T5DH2,
ProcessData,MAIN_MAINPD_ID,3,A6L511NY.00,
ProcessData,MAINPD_ID,3,A6L511NY.00,
ProcessData,FLOW_TYPE,3,Main,
ProcessData,FLOW_TYPE_NO,1,1,
ProcessData,D_SEQNO,1,169,
ProcessData,OP_NO,3,PNH PEP.MA1,
ProcessData,OP_NO_NAME,3,本処理,
ProcessData,PD_IDENT,3,PPNHIMA1.00,
ProcessData,PD_IDENT_NAME,3,PEP,
ProcessData,EQP_GROUP_CODE,3,PKRF,
ProcessData,EQP_GROUP_NAME,3,KrF SCANNER(SK3000 + ES5),
ProcessData,EQP_GROUP_BIND,3,PKRF,
ProcessData,EQP_ID,3,PKRF004,
ProcessData,PH_RECIPE_ID,3,PES5MIX,
ProcessData,RCP_NAME_SPACE,3,PEPMA,
ProcessData,LC_RECIPE_ID,3,PKRF.01,
ProcessData,RECIPE_ID,3,PEPMA.PES5MIX,
ProcessData,S_DATE,4,2019/01/24 12:47:09,
ProcessData,E_DATE,4,2019/01/24 12:47:51,
ProcessData,CAST_ID,3,PA0-00349,
ProcessData,SLOT_NO,1,19,

の中からSplitを用いて string[]dataTemp = fileData.Split(',');で
(ProcessData[0],EQP_ID[1],3[2],PKRF004[3],)のように配列に格納して
ifを使ってdataTemp[1] == "EQP_ID"の時にdataTemp[3](PKRF004)を
    dataTemp[1] == "LOT_ID"の時にdataTemp[3] (AP0076686.00C)を
    dataTemp[1] == "WAFER_ID"の時にdataTemp[3] (AP0076686.19)を
dataTemp[1] == "S_DATE"の時にdataTemp[3](2019/01/24 12:47:09)を
新たにCSVファイルを作成して上記のデータを入力したリストを作りたいのですが、C#初心者で
色々と試行錯誤しましたが知識が足りないようです。。。。


リストについてはヘッダーなどは必要ありません。.datが大量にあるので一列にEQP_ID、LOT_ID、WAFER_ID、S_DATEが並んだ状態で何100行とある状態リストを作成したいです。

詳しい方ご教授をお願いいたします。

いつもお世話になります。
複数の.datファイル(カンマ区切りの4~5列、約800行程度)
ProcessData,LOT_ID,3,AP0076686.00C,
ProcessData,LOT_ID_SUB,3,AP0076686.00,
ProcessData,LOT_NO,3,AP0076686,
ProcessData,WAFER_ID,3,AP0076686.19,
ProcessData,WAFER_NO,1,19,
ProcessData,PRODSPEC_ID,3,T5DH20001-00001.00,
ProcessData,PRODGRP_ID,3,T5DH2,
ProcessData,PRODGRP_BIND,3,T5DH2,
ProcessData,MAIN_MAINPD_ID,3,A6L511NY.00,
ProcessData,MAINPD_ID,3,A6L511NY.00,
ProcessData,FLOW_TYP...続きを読む

Aベストアンサー

質問内容が多岐に渡ってきているため、どこまで出来て、どこが出来ないのか、を整理して、
改めて質問を行うことをお勧めします。

今できないのは、元の質問内容ではなく、それぞれのロジックの書き方を理解していませんよね。
C#の文法。
対象ディレクトリ内のファイルの一覧を得るにはどうすればいいのか。
ファイルの読み込み、書き出しをするにはどうすればいいのか。
繰り返し処理するにはどうすればいいのか。
など。

最終目的を質問しても、誰も正解は教えてくれませんし、ネットには正解は転がっていません。
知識、情報を組み合わせて正解を作り上げるので。

そのため、実現するためのプロセスを細分化し、プロセス単位に方法論をネットで調べるとか、質問するとかになると思います。

QC#について質問【足し算】

C#超初心者です。

標準入力から2つの正の整数a,bが入力されます。aとbを足した数を出力するのですが、

入力は以下のフォーマットで与えられます。
a b
aとbの間には半角スペースが入っています。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
aとbを足した数を出力して下さい。
最後は改行し、余計な文字、空行を含んではいけません。

入力例1
1 1

出力例1
2

入力例2
0 99

出力例2
99


public class Sum{
public static void Main(string[]args){
var line = System.Console.ReadLine();
int[]ab = line.Split(' ');
System.Console.WriteLine(ab[0] + ab[1]);
}
}


Splitを使って半角スペースで文字列を分割しましたが。int型ではないので足し算をしても「11」に
なるようです。string型からint型への変換は可能でしょうか?
また上記のコードも間違えているのでどなたかご教授をお願い致します。

C#超初心者です。

標準入力から2つの正の整数a,bが入力されます。aとbを足した数を出力するのですが、

入力は以下のフォーマットで与えられます。
a b
aとbの間には半角スペースが入っています。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
aとbを足した数を出力して下さい。
最後は改行し、余計な文字、空行を含んではいけません。

入力例1
1 1

出力例1
2

入力例2
0 99

出力例2
99


public class Sum{
public static v...続きを読む

Aベストアンサー

int.Parse(ab[0]) + int.Parse(ab[1])

QC# クラスの代入について

こんにちは。
教えて下さい。

派生クラスは基本クラスが持っているメンバ変数やメンバメソッドを引き継ぐという認識です。
この場合、基本クラスがCard  派生クラスがSpadeAce

派生クラスである「SpadeAce」の方がCARDクラスを取り込めるというイメージです。

以下のプログラム中の部分においてCard型の参照変数「CARD」はSpadeAceクラスの
インスタンスをなぜ代入できるのでしょうか?

Card card = new SpadeAce();

class SpadeAce : Card  Cardクラスを継承してSpadeAceクラスを作っているので
SpadeACE型の参照変数であればCARDクラスのインスタンスを作成できるのではないかとおもう
んですが、ちがうんでしょうか?

宜しくお願いいたします。

以下のプログラムの実行結果は
スペード Aです。
------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace cs11_1
{
class Program
{
static void Main(string[] args) {
Card card = new SpadeAce();
card.Show();
}
}
abstract class Card
{
abstract public string mark { get; }
abstract public string Number { get; }
public void Show()
{
Console.Write(mark);
Console.Write(Number);
Console.ReadLine();
}
}
class SpadeAce : Card
{
public override string mark {
get { return "スペード"; }
}
public override string Number {
get { return "A"; }
}
}
}

こんにちは。
教えて下さい。

派生クラスは基本クラスが持っているメンバ変数やメンバメソッドを引き継ぐという認識です。
この場合、基本クラスがCard  派生クラスがSpadeAce

派生クラスである「SpadeAce」の方がCARDクラスを取り込めるというイメージです。

以下のプログラム中の部分においてCard型の参照変数「CARD」はSpadeAceクラスの
インスタンスをなぜ代入できるのでしょうか?

Card card = new SpadeAce();

class SpadeAce : Card  Cardクラスを継承してSpadeAceクラスを作っている...続きを読む

Aベストアンサー

No.6のお礼欄

> SuperClass型( sub_super )にはSuperClass型のインスタンスは代入されてないのに
> SuperClass型のSampleFunctionが実行されるのはなぜでしょうか?


No.7様で既に回答がありますが。
かみ砕いて説明してみます。


SubClassは、SuperClassを継承しているので、SuperClass型のSampleFunctionを持っています。
その上で必要であれば、部分を上書き(override)や隠蔽(new)で再定義して挙動を変えているのです。


>> SuperClass型の変数に代入した時点で、そのインスタンスはSuperClass型として振舞う様になります。

というのは、
SuperClass型の変数に代入した時点で、SubClass型のインスタンスの中のSuperClassの部分が見えてくるようになるということです。
(これをアップキャストといいます)
だから、SubClass型のインスタンスにも関わらずSuperClass型のSampleFunctionが実行されるのです。


ちなみに、SuperClass型の変数に代入(アップキャスト)したSubClass型のインスタンスは、ダウンキャストすれば本来のSubClass型の挙動を取り戻すことができるようになります。


class Sample1
{
static void Main(string[] args)
{
SuperClass c1 = new SubClass();//アップキャスト
SubClass c2 = (SubClass)c1;//ダウンキャスト

Console.WriteLine("c1の型は {0}", c1.GetType());//c1の型は Sample1.SubClass
c1.SampleFunction();//これはスーパークラス
Console.WriteLine("c2の型は {0}", c2.GetType());//c2の型は Sample1.SubClass
c2.SampleFunction();//これはサブクラス
}

}



以下、余談です。

最初、なぜこのような疑問を持つのかよくわからなかったのですが、No.7様の回答を拝見して成程と思いました。
別のご質問の回答にも書きましたが、やはり件の書籍はプログラミング自体の初心者には適さないのではないでしょうか。

No.6のお礼欄

> SuperClass型( sub_super )にはSuperClass型のインスタンスは代入されてないのに
> SuperClass型のSampleFunctionが実行されるのはなぜでしょうか?


No.7様で既に回答がありますが。
かみ砕いて説明してみます。


SubClassは、SuperClassを継承しているので、SuperClass型のSampleFunctionを持っています。
その上で必要であれば、部分を上書き(override)や隠蔽(new)で再定義して挙動を変えているのです。


>> SuperClass型の変数に代入した時点で、そのインスタンスはSuperClass型とし...続きを読む

Q関数によって、MAX_PATHの値が異なる理由を教えてください。

MAX_PATHは260固定なのに、関数によって異なる理由を教えてください。

CreateFileは259文字まで、それ以上は関数が失敗します。
MakeSureDirectoryPathExistsは248文字まで、それ以上は関数が失敗します。
renameは220文字まで、それ以上は関数が失敗します。

Aベストアンサー

昔のファイルシステム(FAT)ではパス名の最長が255文字に制限されていました。
それに、ドライブレター等(C:¥)3文字とファイル名(8+3)の間のピリオド1文字で
255+3+1=259文字が最長パスです。
さらに、C言語で作成されたライブラリでは、
文字列の末尾にはNull文字(0x00)を付ける約束になっています。
それを含めて、MAX_PATH=260 となっています。
今どきのファイルシステム(NTFS)とはかなり違いますよね。
そんな訳で、時代とともに移り変わるシステムの中身が、
統一が取れているはずと思う方がおかしい。

Q[C#]Visual C# .NETで、コンソールアプリを埋め込んで実行し、それのログを表示させる

C#を使って自己解凍ファイル(gui)を作りたいです。
中にunrar等の解凍用のexe(コンソールアプリ)を埋め込んで、
ボタンをクリックしたら、中のexeにカレントディレクトリに指定したファイルを解凍するようなdosコマンドを出力して実行させたいです。
実行中、限られた行だけのログを.NETのテキストボックスに表示させたいです。
何かいい方法はないでしょうか?

Aベストアンサー

using System;
using System.Text;
using System.Windows.Forms;

namespace Sample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.OutputDataReceived += OutputDataReceived;

p.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec");
p.StartInfo.RedirectStandardInput = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.Arguments = @"/c dir c:\ /w";

p.Start();
p.BeginOutputReadLine();

p.WaitForExit();
p.Close();
}

private async void OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
Action action = () =>
{
var sb = new StringBuilder(textBox1.Text);
sb.Append(e.Data + Environment.NewLine);
textBox1.Text = sb.ToString();
};

this.BeginInvoke(action);
}
}
}

using System;
using System.Text;
using System.Windows.Forms;

namespace Sample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Outpu...続きを読む

QC#言語学んで

実際にプログラム打ち込んでも無反応です
何か打ち込んでもダメです
そしてエラーが起きます

Aベストアンサー

> そしてエラーが起きます

という事は、開発環境なんかはインストール、設定されてるって事ですね?

まずは、サンプルプログラムを打ち込む、というかコピペしてみては。

Microsoft .NET - Hello World -- 最初のプログラム (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/inside-a-program/hello-world-your-first-program

で、エラーが出るなら、エラーメッセージの内容を提示すると、問題解決の手掛かりになるかも。

QC# 静的 (static) メソッドについて

こんばんは。
staticがついているメソッドから、staticのついていないメソッドを呼び出すことはできない」
という記載がありました。 また、console.writeLineと記載できるのはCONSOLEクラスで
WRITELINEメソッドはSTATICを利用してつくられているためです。と記載されておりました。
(C#超入門 p203より)
質問
CONSOLEクラスのWRITELIENはSTATICがついていおりますが、
PUBLIC void attack()にはついてない。のになぜConsole.WriteLineをよびだせるのでしょうか? 宜しくお願いいたします。

public void Attack() ※staticがついてないメソッド
{
Console.WriteLine(this.name + "は攻撃した");
}


-------------------Player.cs----------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SampleRPG
{
class Player
{
// privateなメンバ変数を宣言
private string name;
private int hp;

// 以下、publicなコンストラクタとメンバメソッドを定義
public Player(string name, int hp)
{
this.name = name;
this.hp = hp;
}

public void Attack()
{
Console.WriteLine(this.name + "は攻撃した");
}

public void Defense()
{
Console.WriteLine(this.name + "は防御した");
}
}
}

-------------program.cs----
sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SampleRPG
{
class Program
{
static void Main(string[] args)
{
Player player = new Player("たかし", 500);
player.Attack(); // publicなメソッドなので呼び出せる
}
}
}

こんばんは。
staticがついているメソッドから、staticのついていないメソッドを呼び出すことはできない」
という記載がありました。 また、console.writeLineと記載できるのはCONSOLEクラスで
WRITELINEメソッドはSTATICを利用してつくられているためです。と記載されておりました。
(C#超入門 p203より)
質問
CONSOLEクラスのWRITELIENはSTATICがついていおりますが、
PUBLIC void attack()にはついてない。のになぜConsole.WriteLineをよびだせるのでしょうか? 宜しくお願いいたします。

p...続きを読む

Aベストアンサー

No.2です。

> STATICがついていないメソッドからはSTATICがついているメソッドをよびだせるってことでしょうか?

そうです。
実際にお手元の本のプログラムも、それで問題なく動いていますよね?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング