Основной вопрос программирования без языкового программирования - PullRequest
3 голосов
/ 10 апреля 2010

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

Так что извините, если я как-то испорчу.

Вопрос

Допустим, у меня class A,B,C and D сейчас class A есть некоторый фрагмент кода, который мне нужно иметь в class B,C and D, поэтому я расширяю class A в class B, class C, and class D

Теперь, как я могу получить доступ к функции class A в других классах, нужно ли мне создать объект class A, а затем получить доступ к функции class A или как расширение A в других классах, чем я? Можно внутренне вызвать функцию, используя этот параметр.

Если возможно, я был бы очень признателен, если бы кто-нибудь смог объяснить эту концепцию с помощью примера кода, объясняющего, как протекает логика.

Примечание

Пример на Java, PHP и .Net приветствуется.

Ответы [ 6 ]

2 голосов
/ 10 апреля 2010

Давайте забудем о C и D, потому что они такие же, как B. Если класс B расширяет класс A, то объекты типа B также являются объектами типа A. Всякий раз, когда вы создаете объект типа B, вы также создаете объект типа A. Он должен иметь доступ ко всем методам и данным в A (кроме тех, которые помечены как частные, если ваш язык поддерживает модификаторы доступа), и к ним можно обращаться напрямую. Если B переопределяет некоторые функциональные возможности A, то обычно язык предоставляет средство для вызова реализации базового класса (base.Foo () или чего-то подобного).

Пример наследования: C #

public class A
{
     public void Foo() { } 
     public virtual void Baz() { }
}

public class B : A  // B extends A
{
      public void Bar()
      {
          this.Foo();  // Foo comes from A
      }

      public override void Baz() // a new Baz
      {
          base.Baz();  // A's Baz
          this.Bar();  // more stuff
      }
}

Если, с другой стороны, вы использовали композицию вместо наследования и B содержит экземпляр A в качестве переменной класса, то вам нужно создать объект A и ссылаться на него (public ) функциональность через этот экземпляр.

Пример композиции: C #

 public class B // use A from above
 {
     private A MyA { get; set; }

     public B()
     {
         this.MyA = new A();
     }

     public void Bar()
     {
         this.MyA.Foo();  // call MyA's Foo()
     }
 }
2 голосов
/ 10 апреля 2010

в зависимости от уровня доступа (будет защищен или общедоступен в .NET), вы можете использовать что-то вроде:

base.method(argumentlist);

базовое ключевое слово в моем примере относится к C #

нет необходимости в экземпляре класса A, потому что у вас уже есть унаследованный экземпляр класса A

0 голосов
/ 10 апреля 2010

Мне кажется, что продление вашего класса может быть не лучшим вариантом. Классы «B», «C» и «D» должны расширять класс «A» только в том случае, если они действительно являются расширением этого класса, а не просто для доступа к какому-либо методу. Например, «Huffy» не должен расширять «BrandNames» только потому, что «Huffy» является торговой маркой, и вам нужен доступ к одному из методов «BrandNames». Вместо этого «Huffy» должен расширить «Bicycle» и реализовать интерфейс, чтобы можно было использовать методы «BrandNames». Дополнительным преимуществом здесь является то, что (в Java) можно использовать несколько интерфейсов, но класс можно расширить только один раз. Если в вашем примере классу «B» требуется доступ к методу из класса «A», который может работать, но если классу «C» нужен доступ к методу из класса «A» и класса «B», то вы должны использовать интерфейс в классе "'C".

0 голосов
/ 10 апреля 2010

Вот краткий пример Java:

public class Aclass
{
    public static void list_examples()
    {
        return("A + B = C");
    }
}
public class Bclass extends Aclass
{
    public static void main(String [] args)
    {
        System.out.println("Example of inheritance "+list_examples);
    }
}

Обратите внимание, что метод доступа к родительскому классу не должен меняться. Поскольку вы расширяете, вы не должны говорить parent:: или что-то , если вы не переопределяете родительский метод / функцию .

0 голосов
/ 10 апреля 2010

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

Конечно, довольно часто для реализации B метода полезно вызывать реализацию A для того же объекта, как правило, потому что подкласс оборачивает дополнительное поведение вокруг базового определения суперкласса. То, как вы это делаете, зависит от языка; например, в Java вы делаете это:

super.methodName(arg1, ...);
0 голосов
/ 10 апреля 2010

Обычно вам нужна ссылка на родительский класс.

В PHP:

parent::example();

От: http://www.php.net/manual/en/keyword.parent.php

<?php
class A {
    function example() {
        echo "I am A::example() and provide basic functionality.<br />\n";
    }
}

class B extends A {
    function example() {
        echo "I am B::example() and provide additional functionality.<br />\n";
        parent::example();
    }
}

$b = new B;

// This will call B::example(), which will in turn call A::example().
$b->example();
?>
...