0Pricing
C# Academy · レッスン

プロパティと基底型との組み合わせ

パラメーターを基底型とプロパティに転送します。

「プロパティと基底型との組み合わせ」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

プライマリコンストラクターと継承の組み合わせ

プライマリコンストラクターを持つ派生クラスでは、ヘッダーの: Base(args)構文を使ってパラメーターを基底クラスに渡せます。

using System;

class Animal(string name) {
    public string Name => name;
}

class Dog(string name) : Animal(name) {
    public string Speak() => Name + " says Woof";
}

Console.WriteLine(new Dog("Rex").Speak()); // Rex says Woof

パラメーターの一部だけを渡す

派生クラスは基底クラスより多くのパラメーターを受け取り、そのうち関係するものだけを基底クラスに渡せます。

using System;

class Shape(string color) {
    public string Color => color;
}

class Box(string color, int size) : Shape(color) {
    public int Size => size;
}

var b = new Box("red", 5);
Console.WriteLine(b.Color + " " + b.Size); // red 5

引数を基底クラス用に変換する

ヘッダー内で、派生クラスのパラメーターから基底コンストラクターの引数を計算できます。

using System;

class Label(string text) {
    public string Text => text;
}

class UpperLabel(string text) : Label(text.ToUpper()) {
}

Console.WriteLine(new UpperLabel("hi").Text); // HI

プロパティを追加する

プライマリコンストラクターと明示的なプロパティは共存できます。宣言時にパラメーターからプロパティを初期化してください。

using System;

class Product(string name, decimal price) {
    public string Name { get; } = name;
    public decimal Price { get; set; } = price;
}

var p = new Product("Book", 12m);
p.Price = 10m;
Console.WriteLine(p.Name + " " + p.Price); // Book 10

基底クラスに渡したパラメーターを派生クラスでも使う

派生クラスのプライマリコンストラクターのパラメーターは、基底クラスに渡した後も、派生クラスの本体で使用できます。

using System;

class Base(int id) {
    public int Id => id;
}

class Item(int id, string label) : Base(id) {
    public string Describe() => "#" + id + ": " + label;
}

Console.WriteLine(new Item(7, "Widget").Describe()); // #7: Widget

レコードとプライマリコンストラクター

レコードでは、プライマリコンストラクターによってパブリックな init 専用プロパティが自動生成されます。位置指定レコードはその最も簡潔な形です。

using System;

record Person(string First, string Last) {
    public string Full => First + " " + Last;
}

Console.WriteLine(new Person("Ada", "Lovelace").Full); // Ada Lovelace

レコードの継承

派生レコードは基底レコードに位置指定でパラメーターを渡し、組み合わせたプロパティ一式を生成します。

using System;

record Vehicle(string Make);
record Car(string Make, int Doors) : Vehicle(Make);

var c = new Car("Toyota", 4);
Console.WriteLine(c.Make + " " + c.Doors); // Toyota 4

基底クラスの呼び出し前に検証する

検証が必要な場合は、throw 式を使ってプロパティ初期化子で行います。ただし、基底クラスの呼び出しは先に実行されます。

using System;

class Base(string tag) { public string Tag => tag; }

class Node(string tag) : Base(tag) {
    public string Tag2 { get; } =
        tag.Length > 0 ? tag : throw new ArgumentException("empty");
}

Console.WriteLine(new Node("a").Tag); // a

キャプチャしたパラメーターとプロパティの組み合わせ

一部のパラメーターをキャプチャしたプライベート状態として保持し、他のパラメーターをプロパティとして公開することで、公開インターフェイスを目的に合わせて設計できます。

using System;

class Order(int id, decimal total) {
    public decimal Total { get; } = total; // public
    public string Reference() => "ORD-" + id;   // id stays private
}

var o = new Order(42, 99m);
Console.WriteLine(o.Reference() + " " + o.Total); // ORD-42 99

プロパティの既定値

パラメーターに関連付けないプロパティにも既定の初期化子を設定でき、プライマリコンストラクターのパラメーターと自由に組み合わせられます。

using System;

class Session(string user) {
    public string User { get; } = user;
    public bool Active { get; set; } = true;
}

var s = new Session("kai");
Console.WriteLine(s.User + " " + s.Active); // kai True

まとめて実装する

基底クラスに委譲し、プロパティを追加し、計算されるメンバーを公開する派生クラスです。

using System;

class Employee(string name) {
    public string Name => name;
}

class Manager(string name, int teamSize) : Employee(name) {
    public int TeamSize { get; } = teamSize;
    public string Title => Name + " (manages " + TeamSize + ")";
}

Console.WriteLine(new Manager("Sam", 5).Title); // Sam (manages 5)

簡単な確認

プライマリコンストラクターが基底クラスにどのように委譲するかを確認してください。

まとめ

プライマリコンストラクターをプロパティや基底クラスと組み合わせる方法を学びました。

  • class D(...) : Base(args)で基底クラスに委譲します。
  • 基底クラスへの引数は、ヘッダー内で計算できます。
  • 宣言時にパラメーターからプロパティを初期化できます。
  • レコードでは、位置指定パラメーターからパブリックな init 専用プロパティが生成されます。

よくある質問

「プロパティと基底型との組み合わせ」レッスンは無料ですか?

はい。「プロパティと基底型との組み合わせ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「プロパティと基底型との組み合わせ」で何を学びますか?

パラメーターを基底型とプロパティに転送します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「プロパティと基底型との組み合わせ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. クラスのプライマリコンストラクター
  2. メンバーでのパラメーターのキャプチャ
  3. 構造体のプライマリコンストラクター
  4. プロパティと基底型との組み合わせ
← C# Academyに戻る