重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

こんばんは。
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なメソッドなので呼び出せる
}
}
}

A 回答 (4件)

No.2です。



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

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

ご回答ありがとうございます。
そうでしたか。ありがとうございます。

自分が持っているほんの解説の内容とサンプルプログラムが一致していなかったので困惑してました。

はい。動いてます。
これで、
つける・つけない、なぜついていないのかなぜついているのかが少しわかるようになりました。ありがとうございました。

理由としては、こんなのをみつけました。

staticメソッドで非staticメソッドを呼び出そうとすると、どのオブジェクトのものを呼び出せばいいかわかりません。

(オブジェクトしていすれば特定できうごくんじゃないかとおもうんですが・・・??)

逆に、非staticメソッドからstaticメソッドは呼び出せます。一つしかないからです。

これから勉強していきます。
ありがとうございました。

お礼日時:2019/02/02 23:18

>>よくわからないのですが、


クラスのインスタンスを生成すると呼び出せるようになるらしいです。

オブジェクト指向の言語では、C#だけでなく、C++、Java、JavaScript、PHPなども、インスタンスを生成してから呼び出すのが、お作法です。

>>public void Defense() や attack()は 先頭にSTATICがついてないのに
STATICで定義しているConsole.WriteLineがよびだせているのがわかりません。

Defense、attackは、Playerのメンバーメソッドだから、Playerがインスタンス化されていれば呼び出せます。
    • good
    • 0

??



> staticがついているメソッドから、staticのついていないメソッドを呼び出すことはできない



> public void Defense() や attack()は 先頭にSTATICがついてないのに
> STATICで定義しているConsole.WriteLineがよびだせているのがわかりません。

は矛盾しませんよね?
呼ぶメソッドと呼ばれるメソッドのstaticの付き方が逆です。
    • good
    • 1
この回答へのお礼

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

私がかいたのですが、
> staticがついているメソッドから、staticのついていないメソッドを呼び出すことはできない 
逆に、
STATICがついていないメソッドからはSTATICがついているメソッドをよびだせるってことでしょうか?

お礼日時:2019/02/02 22:21

>>staticがついているメソッドから、staticのついていないメソッドを呼び出すことはできない



C#超入門に書かれているという、この記述が間違っているだけでしょう。
これができないなら、質問のプログラムのMainはPlayerを呼び出せないって話になります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
おっしゃるとおり、C#超入門に書かれているということはよくわからないです。
ねっととかでしらべてみると

>MainはPlayerを呼び出せないって話になります。
よくわからないのですが、
クラスのインスタンスを生成すると呼び出せるようになるらしいです。
(STATIC→非STATICの呼び出しが可能)
今回の質問として、
public void Defense() や attack()は 先頭にSTATICがついてないのに
STATICで定義しているConsole.WriteLineがよびだせているのがわかりません。

お礼日時:2019/02/02 21:56

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