语言不可知基本编程问题

时间:2010-04-10 13:09:43

标签: language-agnostic oop programming-languages

从编程的角度来看,这是一个非常基本的问题,但是当我处于学习阶段时,我认为我最好不要问这个问题而不是对这个主题有误解或狭隘的知识。

所以请原谅我,不知怎的,我搞砸了。

问题

假设我现在class A,B,C and D class A我需要在class B,C and D中提供一些代码,因此我在class A <{}}中展开class B, class C, and class D / p>

现在我如何在其他类中访问class A的功能,我是否需要创建class A的对象,而不是访问class A的功能或正在扩展{{在其他类中,我可以使用此参数在内部调用该函数。

如果可能的话,如果有人能用解释逻辑如何流动的代码示例来解释这个概念,我将非常感激。

注意

Java,PHP和.Net中的示例将不胜感激。

6 个答案:

答案 0 :(得分:2)

取决于访问级别(在.NET中受保护或公开),您可以使用以下内容:

base.method(argumentlist);

我的示例中的base关键字特定于C#

不需要A类的实例,因为您已经拥有了A类继承的实例

答案 1 :(得分:2)

让我们忘记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的对象并引用它(通过该实例的公共功能。

组成示例: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 :(得分:0)

基本上你需要对父类的引用。

在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();
?>

答案 3 :(得分:0)

我发现驯服继承复杂性的最好方法是确保我只在B继承A时才真正成为超类的特化。那时,我可以从A内部调用B的方法,就好像它们是B自己的方法一样,如果B覆盖了它们,那么我可以只是假设这必须是有充分理由的。

当然,B实现一个方法来调用A在同一个对象上的实现通常很有用,通常是因为子类围绕超类的基本包装了额外的行为。定义。你这样做的方式因语言而异;例如,在Java中你可以这样做:

super.methodName(arg1, ...);

答案 4 :(得分:0)

这是一个简单的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::或任何

答案 5 :(得分:0)

在我看来,扩展你的课程可能不是你最好的选择。类“B”,“C”和“D”只应扩展类“A”,如果它们确实是该类的扩展,而不仅仅是访问某些方法。例如,“Huffy”不应仅仅因为“Huffy”是一个品牌名称并且您想要访问“BrandNames”的方法之一而扩展“BrandNames”。 “Huffy”应该改为扩展“Bicycle”并实现界面,因此可以使用“BrandNames”的方法。这里的另一个好处是(在Java中)可以使用多个接口,但是类只能扩展一次。如果在您的示例类“B”中需要访问可能有效的类“A”中的方法,但是如果类“C”需要访问类“A”和类“B”中的方法那么您将拥有使用“C”类中的接口。