<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=C_Sharp%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9</id>
	<title>C Sharpの基礎 - 抽象クラス - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=C_Sharp%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9"/>
	<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=C_Sharp%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9&amp;action=history"/>
	<updated>2026-07-16T00:58:00Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://mochiu.net/index.php?title=C_Sharp%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9&amp;diff=3229&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == 抽象クラスとは、インスタンスを生成できないクラスのことで、継承することを前提としたクラスのことである。&lt;br&gt;…」</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=C_Sharp%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9&amp;diff=3229&amp;oldid=prev"/>
		<updated>2021-03-13T11:28:08Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == 抽象クラスとは、インスタンスを生成できないクラスのことで、継承することを前提としたクラスのことである。&amp;lt;br&amp;gt;…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
抽象クラスとは、インスタンスを生成できないクラスのことで、継承することを前提としたクラスのことである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
抽象メソッドとは、実装を持たず、メソッドの意味(規約)のみを定義したメソッドである。&amp;lt;br&amp;gt;&lt;br /&gt;
抽象メソッドの実装は、基底クラスでは行わず、派生クラスに記述する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下に、抽象クラス・抽象メソッドの特徴を示す。&amp;lt;br&amp;gt;&lt;br /&gt;
* クラスやメソッドの修飾子として、&amp;lt;code&amp;gt;abstract&amp;lt;/code&amp;gt;修飾子を付加する。&lt;br /&gt;
* 抽象メソッドは、基底クラスではメソッドの意味(規約)のみを定義して、派生クラスで具体的な実装を記述するメソッド。&amp;lt;br&amp;gt;(C++において、純粋仮想関数と呼ばれるもの)&lt;br /&gt;
* 抽象メソッドを1つでも持つクラス(抽象クラス)は、インスタンスを生成することができない。&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 抽象化 ==&lt;br /&gt;
C#には、インスタンスを生成できないクラスや実装の無いメソッド(派生クラスでオーバーライドする)を定義するための構文が存在する。&amp;lt;br&amp;gt;&lt;br /&gt;
インスタンスを生成できないクラスは、抽象クラスと呼ばれる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
抽象クラスを作成するには、クラスの定義時に&amp;lt;code&amp;gt;abstract&amp;lt;/code&amp;gt;修飾子を付加する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
 abstract class Person&lt;br /&gt;
 {&lt;br /&gt;
    protected int age;&lt;br /&gt;
 &lt;br /&gt;
    // 抽象クラスなので、コンストラクタが public であってもインスタンスは生成できない。&lt;br /&gt;
    public Person(int age)&lt;br /&gt;
    {&lt;br /&gt;
       this.age  = age;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public virtual int Age&lt;br /&gt;
    {&lt;br /&gt;
       get =&amp;gt; 0;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
意味(規約)のみを定義して、実装は派生クラスに記述するメソッドは、抽象メソッドと呼ばれる。&amp;lt;br&amp;gt;&lt;br /&gt;
抽象メソッドを作成するには、メソッドに&amp;lt;code&amp;gt;abstract&amp;lt;/code&amp;gt;修飾子を付加する。なお、抽象メソッドは抽象クラスのみ定義できる。&amp;lt;br&amp;gt;&lt;br /&gt;
また、抽象プロパティを作成するには、&amp;lt;code&amp;gt;abstract&amp;lt;/code&amp;gt;修飾子を付加する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
 abstract class Person&lt;br /&gt;
 {&lt;br /&gt;
    protected int age;&lt;br /&gt;
 &lt;br /&gt;
    public Person(int age)&lt;br /&gt;
    {&lt;br /&gt;
       this.age = age;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public abstract int Age&lt;br /&gt;
    {&lt;br /&gt;
       get;  // 抽象プロパティに定義は不要&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下の例では、抽象クラスを定義している。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
 using System;&lt;br /&gt;
 &lt;br /&gt;
 // 抽象クラス&lt;br /&gt;
 abstract class Person&lt;br /&gt;
 {&lt;br /&gt;
    protected string name;&lt;br /&gt;
    protected int age;&lt;br /&gt;
 &lt;br /&gt;
    public Person(string name, int age)&lt;br /&gt;
    {&lt;br /&gt;
       this.name = name;&lt;br /&gt;
       this.age  = age;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public string Name&lt;br /&gt;
    {&lt;br /&gt;
       get =&amp;gt; this.name;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public abstract int Age&lt;br /&gt;
    {&lt;br /&gt;
       get;  // 抽象プロパティに定義は不要&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// &amp;lt;summary&amp;gt;&lt;br /&gt;
 /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
 class Truepenny : Person&lt;br /&gt;
 {&lt;br /&gt;
    public Truepenny(string name, int age) : base(name, age)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public override int Age&lt;br /&gt;
    {  // 実年齢を返す&lt;br /&gt;
       get =&amp;gt; return this.age;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// &amp;lt;summary&amp;gt;&lt;br /&gt;
 /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
 class Liar : Person&lt;br /&gt;
 {&lt;br /&gt;
    public Liar(string name, int age) : base(name, age)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public override int Age&lt;br /&gt;
    {&lt;br /&gt;
       get&lt;br /&gt;
       {  // サバを読んだ年齢を返す&lt;br /&gt;
          if(this.age &amp;lt; 20) return this.age;&lt;br /&gt;
          if(this.age &amp;lt; 25) return this.age - 1;&lt;br /&gt;
          if(this.age &amp;lt; 30) return this.age - 2;&lt;br /&gt;
          if(this.age &amp;lt; 35) return this.age - 3;&lt;br /&gt;
          if(this.age &amp;lt; 40) return this.age - 4;&lt;br /&gt;
 &lt;br /&gt;
          return this.age - 5;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// &amp;lt;summary&amp;gt;&lt;br /&gt;
 /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
 class Equivocator : Person&lt;br /&gt;
 {&lt;br /&gt;
    public Equivocator(string name, int age) : base(name, age)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public override int Age&lt;br /&gt;
    {  // 年齢を四捨五入した値を返す&lt;br /&gt;
       get =&amp;gt; ((this.age + 5) / 10) * 10;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class Sample&lt;br /&gt;
 {&lt;br /&gt;
    static void Main()&lt;br /&gt;
    {&lt;br /&gt;
       Introduce(new Truepenny  (&amp;quot;hoge&amp;quot;, 24));&lt;br /&gt;
       Introduce(new Liar       (&amp;quot;piyo&amp;quot;, 24));&lt;br /&gt;
       Introduce(new Equivocator(&amp;quot;fuga&amp;quot;, 24));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    static void Introduce(Person p)&lt;br /&gt;
    {&lt;br /&gt;
       Console.Write(&amp;quot;My name is {0}.\n&amp;quot;, p.Name);&lt;br /&gt;
       Console.Write(&amp;quot;I&amp;#039;m {0} years old.\n\n&amp;quot;, p.Age);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 # 出力&lt;br /&gt;
 My name is hoge.&lt;br /&gt;
 I&amp;#039;m 24 years old.&lt;br /&gt;
 &lt;br /&gt;
 My name is piyo.&lt;br /&gt;
 I&amp;#039;m 23 years old.&lt;br /&gt;
 &lt;br /&gt;
 My name is fuga.&lt;br /&gt;
 I&amp;#039;m 20 years old.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:C_Sharp]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>