这与我之前看过的答案略有不同,或者我没有得到它。我有一个父类,其方法名为MyMethod()
,变量public Int32 CurrentRow;
public void MyMethod()
{
this.UpdateProgressBar();
}
在父级中,我创建了ChildClass
Boolean loadData = true;
if (loadData)
{
ChildClass childClass = new ChildClass();
childClass.LoadData(this.Datatable);
}
在子类LoadData()
方法中,我希望能够设置父级的CurrentRow
变量并调用MyMethod()
函数。
我该怎么做?
答案 0 :(得分:53)
要访问父类的属性和方法,请使用base
关键字。因此,在您的子类LoadData()
方法中,您可以这样做:
public class Child : Parent
{
public void LoadData()
{
base.MyMethod(); // call method of parent class
base.CurrentRow = 1; // set property of parent class
// other stuff...
}
}
请注意,您还必须将父MyMethod()
的访问修饰符更改为至少protected
,以便子类访问它。
答案 1 :(得分:9)
找到了解决方案。
在父级中,我声明了一个ChildClass()的新实例,然后将该类中的事件处理程序绑定到父级中的本地方法
在子类中,我添加了一个公共事件处理程序:
public EventHandler UpdateProgress;
在父级中,我创建了这个子类的新实例,然后将本地父事件绑定到子级中的public
eventhandler
ChildClass child = new ChildClass();
child.UpdateProgress += this.MyMethod;
child.LoadData(this.MyDataTable);
然后在子类的LoadData()
中我可以调用
private LoadData() {
this.OnMyMethod();
}
OnMyMethod
的位置:
public void OnMyMethod()
{
// has the event handler been assigned?
if (this.UpdateProgress!= null)
{
// raise the event
this.UpdateProgress(this, new EventArgs());
}
}
这会在父类
中运行该事件答案 2 :(得分:2)
执行此操作的一种方法是将ParentClass
的实例传递给构造上的ChildClass
public ChildClass
{
private ParentClass parent;
public ChildClass(ParentClass parent)
{
this.parent = parent;
}
public void LoadData(DateTable dt)
{
// do something
parent.CurrentRow++; // or whatever.
parent.UpdateProgressBar(); // Call the method
}
}
确保在父级内部构建this
时将引用传递给ChildClass
:
if(loadData){
ChildClass childClass = new ChildClass(this); // here
childClass.LoadData(this.Datatable);
}
警告:这可能是不组织课程的最佳方式,但它直接回答了你的问题。
编辑:在评论中,您提到超过1个父类想要使用ChildClass
。这可以通过引入接口来实现,例如:
public interface IParentClass
{
void UpdateProgressBar();
int CurrentRow{get; set;}
}
现在,确保在两个(所有?)父类上实现该接口并将子类更改为:
public ChildClass
{
private IParentClass parent;
public ChildClass(IParentClass parent)
{
this.parent = parent;
}
public void LoadData(DateTable dt)
{
// do something
parent.CurrentRow++; // or whatever.
parent.UpdateProgressBar(); // Call the method
}
}
现在任何实现IParentClass
的东西都可以构造ChildClass
的实例并将this
传递给它的构造函数。