是否可以从抽象类中定义的方法中获取对调用虚方法的类的引用?
基本上,我有一个抽象类,让我们说BaseAction,它包含一个名为RetrieveData的虚方法:
public abstract class BaseAction
{
protected virtual void RetrieveData()
{
}
}
在实现中,我将这个虚方法作为Action传递给一个方法,为此产生了一些效果:
public class Action: BaseAction
{
public Action()
{
ActionStatement(RetrieveData);
}
}
可以在RetrieveData方法中获取对Action类的引用,而不必在Action类中覆盖它,这样做会产生这样的效果:
public abstract class BaseAction
{
protected virtual void RetrieveData()
{
// using reflection to get a handle on instance of Action?
}
}
原因是,我想在各种不同类型的类中使用这个虚方法,每个类都有一个需要修改的ID字段,但我不想覆盖这个虚方法20多个动作类中的每一个,只是为了更改ID字段。
我希望在基类中发生这种情况,以限制代码重复的数量。
答案 0 :(得分:0)
你不需要反思这一点。你有很多选择:
如果ID字段在每个实现的类中都是通用的,只需在抽象类中声明它并更改RetrieveData()
方法中的值。
public abstract class BaseAction
{
protected int ID;
protected virtual void RetrieveData()
{
}
}
如果ID字段在所有已实现的类中不常见,则可以添加抽象方法并使用该方法访问ID属性。
public abstract class BaseAction
{
protected abstract ChangeID(int value);
protected virtual void RetrieveData()
{
//Do your stuff
ChangeID(<with-new-value>);
}
}
public class Action: BaseAction
{
Protected override ChangeID(int value)
{
//Do whatever you want
}
public Action()
{
ActionStatement(RetrieveData);
}
}
答案 1 :(得分:0)
如果您这样做:
public abstract class BaseAction
{
protected void Foo()
{
Console.WriteLine(this.GetType());
}
}
public class Action : BaseAction
{
public void Bar()
{
Foo();
}
}
// the runtime type of foo will be Action regardless of compile-time type
BaseAction foo = new Action();
foo.Bar();
它将输出Action
- 也就是说,在继承的方法(Foo()
)中,如果方法最终,对象this
将已经是继承类型Action
通过运行时类型Action
的对象调用。
(暂时忽略类似方法或显式接口实现的new
修饰符。)