トップ «前の日記(2004-11-18 (Thu)) 最新 次の日記(2004-11-27 (Sat))» 編集   RSS 1.0 FEED  

Journal InTime


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(); }

としてしまった。 激しい敗北感。

Tags: 言語