仅覆盖 Get 访问器

5

我获得了一个抽象类:

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

我希望你能将其推导出来,并顺便添加一个set访问器。
 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; }
    }
}

语法错误
有什么想法吗?
谢谢
5个回答

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只能通过公共的SetTest方法在ClassDerived中进行设置。我知道这不如使用属性的setter方法干净,但这是最好的选择。


4
如果一开始在一个类型中定义了只读属性,那么后来就不能再在一个派生类中将其改为可读写的属性。这是.NET的工作方式,不能更改。
另一方面,如果你定义了一个带有只读属性的接口,那么稍后可以在一个类中实现该接口,并使用可写属性。
如果您想分享您尝试实现的内容,也许我们可以设计出一个能够编译的解决方案 :)

你好,谢谢回答。我没有一个“真正”的问题,因为在我的设计中,我可以在基类中添加set访问器。但我只是在想... - Pitming
好的。通常情况下,你实际上并不需要这种能力,因为你经常可以通过设计自己摆脱任何这样的困境。我并不是说你永远不需要它,但大多数情况下你不需要... - Mark Seemann

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

在 MSDN 文档 http://msdn.microsoft.com/en-us/library/aa287786(v=vs.71).aspx 中确实描述了使用“new”关键字作为访问器的方法。 - bas

1

我的第一反应也是将其实现为接口。如果这符合您的设计,以下代码将起作用:

public interface TestInterface
{
   string TestProperty { get; }
}

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

0

不好意思,你不能这样做。这是设计上的限制,也是法律规定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接