我需要在调用override一个时自动调用基类方法(比如构造函数调用base)。例如:
class A
{
public void Fun()
{
Console.Write("Class A!");
}
}
class B : A
{
public void Fun()
{
Console.Write("Class B!");
}
}
我想在屏幕上看到
A级! B级!
执行下一个代码时:
B b = new B();
b.Fun();
有人能告诉我,需要更改示例代码中的内容,或者如何更好地编写以获得所需的结果?感谢。
答案 0 :(得分:20)
如果您不想显式调用它并因此确保在派生类中调用A.Fun()
,则可以使用名为template method pattern的内容:
class A
{
public void Fun()
{
Console.Write("Class A!");
FunProtected();
}
protected virtual void FunProtected()
{
}
}
class B : A
{
protected override void FunProtected()
{
Console.Write("Class B!");
}
}
这会给你:
new A().Fun() -> "Class A!"
new B().Fun() -> "Class A! Class B!"
答案 1 :(得分:8)
如果您需要此类行为,则需要更改平台/语言。 .NET不会自动调用基本方法。你需要明确地调用它。您的方法也需要virtual,否则您将隐藏在派生类中:
class A
{
public virtual void Fun()
{
Console.Write("Class A!");
}
}
class B : A
{
public override void Fun()
{
// call the base method which will print Class A!
base.Fun();
Console.Write("Class B!");
}
}
现在,当你这样做时:
B b = new B();
b.Fun();
您将获得所需的结果。
答案 2 :(得分:2)
仍然可以这样:
interface IFun
{
void Fun();
}
abstract class A : IFun
{
void IFun.Fun()
{
Console.Write("Class A!");
Fun();
}
protected abstract void Fun();
}
class B : A
{
protected override void Fun()
{
Console.Write("Class B!");
}
}
IFun b = new B();
b.Fun();
如果对象引用为IFun,则此方法有效。
答案 3 :(得分:0)
仅供参考,您可以使用将A放在B中的包装模式。这是一个原始示例!
interface IFunClass {
void Fun();
}
class A : IFunClass {
public void IFunClass.Fun() {
Console.Write("Class A!");
}
}
class B : IFunClass {
public B(IFunClass f) {
this.m_SomethingFun = f;
}
public void IFunClass.Fun() {
this.m_SomethingFun.Fun();
Console.Write("Class B!");
}
private IFunClass m_SomethingFun;
}
A a = new A();
B b = new B(a);
b.Fun() // will call a.Fun() first inside b.Fun()
答案 4 :(得分:-2)
没有理由很复杂。只需显式调用父类的方法即可:
if (requestCode == PICK_IMAGE) {
if(resultCode==Activity.RESULT_OK){
Uri file = data.getData(); // you can find path also from here
ImageView.setImageURI(file)
}