2017-04-03 94 views
0

我怎样才能做到这一点:我可以从基类调用孩子的父方法吗?

class BaseClass{ 
    void templateMethod(){ 
    methodImplementation(); 
    if(this.base.getType() != typeof(BaseClass)) this.base.methodImplementation(); 
    } 
    void abstract methodImplementation(); 
} 
class Derived1 : BaseClass{ 
    void override methodImplementation(){ 
    .. do things .. 
    } 
} 
class Derived2 : Derived1{ 
    void override methodImplementation(){ 
    .. do more things .. 
    } 
} 

那么这将导致两个实现(的东西,更多的东西)执行。

Derived2 object = new Derived2(); 
object.templateMethod(); 

然后,所有的孩子和孙子女等等,只需要实现自己的methodImplementation的一部分,并在最后的对象调用时它会被调用在所有水平。

但是this.base不是一件东西。我需要的是调用实例化对象真实类的父对象的实现,但代码位于baseClass中,因此我可以在Template方法模式中使用它。

在此先感谢,抱歉,如果我没有让自己清楚。我只需要知道它是否可以完成。这是良好的做法,最佳,推荐或有用的是我会考虑的另一件事。

编辑:

上面的代码是不完全正确的,它应该是这样的:

class BaseClass{ 
    void templateMethod(){ 
    methodImplementation(); 
    if(this.base.getType() != typeof(BaseClass)) this.base.templateMethod(); 
    } 
    void abstract methodImplementation(); 
} 
class Derived1 : BaseClass{ 
    void override methodImplementation(){ 
    .. do things .. 
    } 
} 
class Derived2 : Derived1{ 
    void override methodImplementation(){ 
    .. do more things .. 
    } 
} 

的不同之处在于在BaseClass.templateMethod()什么被调用在第二行是templateMethod ()而不是methodImplementation(),所以它调用它自己,但是从父类的“视角”。现在我越来越想这是不可能的,并且比任何事情都造成更多的困惑。

+1

你应该坚持术语'Derived'和'Base',这很容易混淆你想要做的事情...... – user3292642

+0

this.base可能不是一件东西,而只是基础。templateMethod()应​​该是? – Slicc

+1

如果您只想从派生类调用基类的方法。为什么你需要使方法抽象并覆盖它? – user3292642

回答

1

如果我理解正确,您想要从顶级派生类中调用所有methodImplementation。你可以这样说:

class BaseClass{ 
    void templateMethod(){ 
    methodImplementation(); 
    } 
    void abstract methodImplementation(); 
} 
class Derived1 : BaseClass{ 
    // virtual as you want to derive it again 
    virtual void override methodImplementation(){ 
    //.. do things .. 
    } 
} 
class Derived2 : Derived1{ 
    void override methodImplementation(){ 
    //.. do more things .. 
    base.methodImplementation(); 
    } 
} 

每一个派生类只需要实现他的methodImplementation和结束部分调用它们的基类。由于methodImplementationabstract请勿在第一级调用base。同时将所有methodImplementation标记为虚拟,以便您可以重新覆盖它。

+0

是的,我知道我可以做到这一点,但我想知道我是否可以避免需要在每个派生类中都调用base.methodImplementation()。做这件事并不是那么努力,但是如果它在底层完成了一次,然后通过一个接口强制所有的实现,这将是一个干净的方式来强制所有的孩子执行它们,甚至不需要它们致电父母。 – mikepa88

0

您可以在派生类中调用基本方法。这是一个例子。您可以在派生类的每一行中调用基本方法;取决于你想要执行逻辑的时间。

public class Animal 
{ 
    public void WhatAmI() 
    { 
     Console.WriteLine("Animal"); 
    } 
} 

public class Fish : Animal 
{ 
    public new void WhatAmI() 
    { 
     base.WhatAmI(); 
     Console.WriteLine("Fish"); 
    } 
} 

public class HammerheadShark : Fish 
{ 
    public new void WhatAmI() 
    { 
     base.WhatAmI(); 
     Console.WriteLine("HammerheadShark"); 
    } 
} 

当调用WhatAmI方法:

var animal = new HammerheadShark(); 
animal.WhatAmI(); 

你会得到这样的:

动物

双髻鲨

+0

是的,我知道我可以这样做,但我想知道是否可以避免需要在每个派生类中都调用base.methodImplementation()。做这件事并不是那么努力,但是如果它在底层完成了一次,然后通过一个接口强制所有的实现,这将是一个干净的方式来强制所有的孩子执行它们,甚至不需要它们致电父母。 – mikepa88

+1

你的代码应该如何知道你想在不调用方法的情况下执行某些逻辑?没有写你的孩子和/或父母的代码是没有办法的。 –

0

好的,即使有一种令人费解的方式来做到这一点,它甚至不会用于我所需要的,我想这对任何一种体面的代码都没有用。

+0

如果您觉得这是正确的答案,请接受此作为答案或完全删除问题,如果您认为保持这一点并不是非常有用。 – PJvG

+0

@PJvG我现在不能接受我自己的安泽,我必须等两天。 – mikepa88

相关问题