我有一个定义a的抽象类get,但不是set,因为就抽象类而言,它只需要一个get.
public abstract BaseClass
{
public abstract double MyPop
{get;}
}
Run Code Online (Sandbox Code Playgroud)
但是,在某些派生类中,我需要一个set属性,所以我正在研究这个实现
public class DClass: BaseClass
{
public override double MyPop
{get;set;}
}
Run Code Online (Sandbox Code Playgroud)
问题是,我有一个编译错误,说
*.set:无法覆盖,因为*.没有可覆盖的set访问器.
即使我认为上述语法完全合法.
有什么想法吗?解决方法,或者为什么会这样?
编辑:我能想到的唯一方法是将两个get和setas放在抽象类中,让子类抛出一个NotImplementedExceptionif set被调用而且没有必要.这是我不喜欢的东西,还有一个特殊的setter方法.
我尝试了以下示例:
public class TestBase
{
public virtual string ReadOnly { get; }
public TestBase()
{
ReadOnly = "from base";
}
}
class Test : TestBase
{
public override string ReadOnly { get; }
public Test()
{
// nothing here
}
}
Run Code Online (Sandbox Code Playgroud)
当我创建一个Test实例时,我看到ReadOnly保持为null.但为什么?我真的不明白它,有人可以向我解释为什么会这样吗?至少我会期望和错误,只能在拥有类之外设置只读属性.
在C#中,我们无法在从基类重写方法时更改访问修饰符.例如
Class Base
{
**protected** string foo()
{
return "Base";
}
}
Class Derived : Base
{
**public** override string foo()
{
return "Derived";
}
}
Run Code Online (Sandbox Code Playgroud)
这在C#中无效,会产生编译时错误.
我想知道原因,为什么不允许这样做.是否存在任何技术问题,或者是否会导致访问限制方面不一致的问题?
我有这样的情况:
public abstract class BaseClass
{
public abstract string MyProp { get; }
}
Run Code Online (Sandbox Code Playgroud)
现在,对于某些派生类,属性值是一个合成值,因此没有setter:
public class Derived1 : BaseClass
{
public override string MyProp { get { return "no backing store"; } }
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,某些派生类需要更传统的后备存储.但是,无论我如何编写它,如在自动属性上,或使用显式的后备存储,我都会收到错误:
public class Derived2 : BaseClass
{
public override string MyProp { get; private set;}
}
public class Derived3 : BaseClass
{
private string myProp;
public override string MyProp
{
get { return myProp;}
private set { myProp = value;}
}
}
Run Code Online (Sandbox Code Playgroud)
Derived2.MyProp.set':无法覆盖,因为'BaseClass.MyProp'没有可覆盖的set访问器
我如何让它工作?
更新: 此问题已经过修改,以使其更加清晰.下面的答案似乎反映出这种方法效果很好.希望这个问题可以帮助那些需要添加get或者添加set现有财产的人.
今天遇到一个问题,我需要get用a get和覆盖基类的-only属性set.目前的共识似乎是这是不可能的,但我认为我找到了一种方法.
一般的想法是创建一个new属性而不是直接override使用旧属性,然后我们通过调用新方法创建一个override旧get方法的桥接方法.
这是一些无法修改的任意预先存在的类型结构的代码.
public abstract class A
{
public abstract int X { get; }
}
public class B : A
{
public override int X { get { return 0; } }
}
Run Code Online (Sandbox Code Playgroud)
我们想编写这段代码,但不会编译.
public class C : B // won't compile: X can't have a 'set' method
{
private int _x;
public override int X …Run Code Online (Sandbox Code Playgroud) 我有一种特殊的字典.我不确定如何准确地执行此操作,但我希望将get方法设为虚拟,而不是set方法:
public TValue this[TKey key]
{
get { ... }
set { ... }
}
Run Code Online (Sandbox Code Playgroud)
是否可能,如果是,那么正确的组合是什么?
有没有我可以在DataGridView中触发DataSourceChanging事件.DataGridView具有DataSourceChanged事件(我相信)在DataSource绑定到DataGridView之后.我希望在属性改变之前做一些事情.
我的示例代码......
private void LoadGrid()
{
// I do some things like saving user settings here
DtgRefundAssign.DataSource = BLL.GetDataSource(parameter1, parameter2); //Just to illustrate
// And restore them after the datasource is bound
}
Run Code Online (Sandbox Code Playgroud)
我需要以多种形式做类似的事情.只要数据源发生变化,只需考虑开发一个通用程序即可完成此任务.恢复部分可以使用DataSourceChanged事件完成...但是我应该处理哪个事件来执行保存部分?
c# ×7
.net ×2
properties ×2
datagridview ×1
dictionary ×1
getter ×1
indexer ×1
oop ×1
overriding ×1
readonly ×1
setter ×1
virtual ×1