我有一个抽象类:
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
答案 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; }
}
}