仅覆盖Get访问者

时间:2009-06-25 13:20:15

标签: c#

我有一个抽象类:

abstract class ClassBase
    {
        public abstract string Test { get; }
    }

我想派生它并顺便添加一个set accesor

 class ClassDerive : ClassBase
    {
        string _s;

        public override string Test
        {
            get { return _s; }
            set { _s = value; }
        }
    }

我不能这样做,因为我可能不会覆盖set

 class ClassDerive2 : ClassBase
    {
        string _s;

        public string Test
        {
            override get { return _s; }
            set { _s = value; }
        }
    }

语法错误

class ClassDerive3 : ClassBase
{
    string _s;

    public override string ClassBase.Test
    {
        get { return _s; }
    }

    public string Test
    {
        set { _s = value; }
    }
}

语法错误

任何想法???

THX

5 个答案:

答案 0 :(得分:6)

你不能完全你想做什么,但这是一个解决方法:

abstract class ClassBase
{
    public abstract String Test { get; }
}

class ClassDerive : ClassBase
{
    string _s;

    public override string Test
    {
        get { return _s; }
    }

    public void SetTest(String test)
    {
        this._s = test;
    }
}

这样,Test只能通过公共ClassDerived方法在SetTest中设置{{1}}。我知道这不像使用属性的setter那么干净,但是它的性能和它一样好。

答案 1 :(得分:3)

如果最初在类型中定义了只读属性,则以后不能将其更改为派生类中的读/写属性。这就是.NET的工作原理,无法改变。

另一方面,如果使用只读属性定义接口,稍后可以在具有可写属性的类中实现该接口。

如果你想分享你想要实现的目标,也许我们可以提出一个有效且可以编译的设计:)

答案 2 :(得分:2)

另一种方式:


    abstract class ClassBase
    {
        public abstract string Test { get; }
    }

    class ClassDerive : ClassBase
    {
        string _s;
        protected void setTest(string s)
        {
            _s = s;
        }

        public override string Test
        {
            get { return _s; }
        }
    }

    class ClassDerive2 : ClassDerive
    {
        public new string Test
        {
            get { return base.Test; }
            set { setTest(value); }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var cd2 = new ClassDerive2();
            cd2.Test = "asdf";
            Console.WriteLine(cd2.Test);
        }
    }

答案 3 :(得分:1)

不,你不能,抱歉。这是设计,所以这是法律。

答案 4 :(得分:1)

我的第一个想法也是将它作为一个接口来实现。如果这符合您的设计,则以下代码将起作用:

public interface TestInterface
{
   string TestProperty { get; }
}

public class TestClass : TestInterface
{
   public string TestProperty
   {
      get { return "test"; }
      set { string t = value; }
   }
}