プロパティと基底型との組み合わせ
パラメーターを基底型とプロパティに転送します。
「プロパティと基底型との組み合わせ」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- クラスのプライマリコンストラクター
- メンバーでのパラメーターのキャプチャ
- 構造体のプライマリコンストラクター
- プロパティと基底型との組み合わせ