2013-03-21 2 views
0

Так вот моя установка и комментарий показывает, что я хочу сделать:Вызов метода в родительском классе

class Process 
{ 
    void SomeMethod() 
    { 
     // Here I want to call Parent.MethodToCall() 
    } 
} 

class Controller 
{ 
    Process c = new Process(); 

    void MethodToCall() 
    { 
    } 
} 

Теперь Controller.MethodToCall() будет вызываться много раз на протяжении всего жизненного цикла Process класса.

Это должен быть вызван только родительский метод, поэтому я считаю, что использование event было бы немного расточительным, поскольку я никогда не удалю обработчик, и будет только один вызов.

Так как я в настоящее время используют, чтобы обойти это, как следует:

class Process 
{ 
    public Func<void> Method { get; set; } 

    void SomeMethod() 
    { 
     Method(); 
    } 
} 

class Controller 
{ 
    Process c = new Process() { Method = MethodToCall } 

    void MethodToCall() 
    { 
    } 
} 

Во-первых, синтаксис не может быть совершенным, я быстро выбил его в блокноте.

Мой вопрос: Каков наилучший способ добиться того, чего я хочу, потому что то, что я делаю, выглядит довольно грязным? ... или я думаю об этом совершенно неправильно с точки зрения дизайна?

По сути, я хочу вызвать метод в классе Controller, не делая его общедоступным, потому что, если он является общедоступным, я могу просто передать контроллер в качестве параметра Process.

+0

Как насчет наследства? Ребенок: родительский – saj

+2

Родительские/дочерние имена заставляют нас думать о наследовании, и это не так, иначе вы можете просто защитить его (или ... это?). Лучшее решение (если делегат не то, что вы хотите) может включать в себя интерфейс (и это единственный случай, когда вы можете даже иметь частное наследование), но вы должны описать ** домен ** ... что лучше в одном случае не может быть хорошим в другом (и вы не получите 1000 ответов о том, как вызвать метод ...) –

+0

Я согласен. на любом сценарии «Дети» могут иметь «Несколько» родителей и «Родители» могут иметь «Несколько «Дети» больше информации о том, как OP намеревается использовать или использует, были бы наиболее полезны для всех нас в отношении предоставления наилучшего ответа. – MethodMan

ответ

3
class Child 
{ 
    Parent parent=null; 
    public Child(Parent p) 
    { 
     parent=p; 
    } 
    void SomeMethod() 
    {   
     parent.MethodToCall(); 
    } 
} 
+0

Ссылка «parent» не объявлена ​​в классе Child. – Oliver

+0

кто редактировал мой код? а затем вниз голосовать? У меня был этот код! Позор тем, кто удалил мой код и проголосовал! – David

+0

Не я, я думаю, что это хорошая альтернатива, если была ссылка на родителя. – Oliver

0

Что вы делаете, это, по сути, сворачивание ваших собственных событий. Внутренне обработчики событий являются только делегатами, прикрепленными к событию, с той разницей, что только владелец события может его поднять.

0

Ну, с точки зрения объектно-ориентированного программирования правильный ответ будет следующим:

class Child : Parent 
{ 
    void SomeMethod() 
    { 
     base.MethodToCall(); 
    } 
} 

class Parent 
{ 
    protected void MethodToCall() 
    { 
     // protected methods are accesible from 
     // descendants and private from outside 
    } 
} 

Но вы всегда можете избежать наследования, используя aggregation

+0

Дети могут иметь более одного родителя. Я не думаю, что это лучшее решение. –

+0

Это не кратное Наследование, где вы видите, что ..? – MethodMan

+1

@DJKRAZE: Я пытаюсь понять комментарий, сделанный AshBurlaczenko –

2

Это должно быть хорошим примером того, как сделать это

class Child : Parent 
{ 
    private void SomeMethod() 
    { 
     base.MethodToCall(); 
    } 
} 

class Parent 
{ 
    Child c = new Child(); 

    protected void MethodToCall() 
    { 
     c.MethodToCall();//not sure if you are wanting to call c.MethodToCall(); 
    } 
} 
Смежные вопросы