2004-11-25 (Thu) [長年日記]
_ C#のプロパティのオーバーライド
mono 1.1.2を試すと、前は通っていた以下のようなコードが通らなくなった。
using System; public class Person { protected string name; public Person(string name) { this.name = name; } public virtual string Name { get { return name; } } } public class MutablePerson : Person { public MutablePerson(string name) : base(name) {} public override string Name { set { this.name = value; } } } public class Test { public static void Main() { Person shugo = new Person("Shugo Maeda"); Console.WriteLine("shugo is {0}", shugo.Name); MutablePerson shugo2 = new MutablePerson("Shugo Maeda"); Console.WriteLine("shugo2 is {0}", shugo2.Name); shugo2.Name = "Studly"; Console.WriteLine("shugo2 is {0}", shugo2.Name); } }
mcs曰く:
$ mcs1.1.2 test.cs test.cs(21) error CS0546: 'MutablePerson.Name': cannot override because 'Person.Name' does not have an overridable set accessor test.cs(11): 'Person.Name' (name of symbol related to previous error) Compilation failed: 1 error(s), 0 warnings
どうも、Person.Nameにsetアクセサがないためにオーバーライドさせてくれないらしい。 interfaceを使うべきなんだろうなあ、と思いつつ
set { throw new NotSupportedException(); }
としてしまった。 激しい敗北感。