Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 语言不可知的基本编程问题_Language Agnostic_Oop_Programming Languages - Fatal编程技术网

Language agnostic 语言不可知的基本编程问题

Language agnostic 语言不可知的基本编程问题,language-agnostic,oop,programming-languages,Language Agnostic,Oop,Programming Languages,从编程的角度来看,这是一个非常基本的问题,但由于我正处于学习阶段,我认为我最好问这个问题,而不是对这个主题有误解或狭隘的认识 如果我把事情搞砸了,请原谅 问题: 假设我有A类、B类、C类和D类现在A类有一些我需要在B类、C类和D类中使用的代码,所以我将A类扩展到B类、C类和D类 现在,我如何在其他类中访问class A的函数,我是否需要创建class A的对象,然后访问class A的函数,或者在其他类中扩展A,这样我就可以使用此参数在内部调用函数了 如果可能的话,如果有人能用解释逻辑如何流动的

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

如果我把事情搞砸了,请原谅

问题

假设我有
A类、B类、C类和D类
现在
A类
有一些我需要在
B类、C类和D类
中使用的代码,所以我将
A类
扩展到
B类、C类和D类

现在,我如何在其他类中访问
class A
的函数,我是否需要创建
class A
的对象,然后访问
class A
的函数,或者在其他类中扩展
A
,这样我就可以使用此参数在内部调用函数了

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

注意


如能以Java、PHP和.Net为例,将不胜感激

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

base.method(argumentlist);
我的示例中的base关键字特定于C#


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

基本上,您需要对父类的引用

在PHP中:

parent::example();
发件人:


让我们忘记C和D,因为它们与B相同。如果B类扩展了A类,那么B类型的对象也是A类型的对象。无论何时创建B类型的对象,都是创建A类型的对象。它应该可以访问A中的所有方法和数据(标记为私有的除外,如果您的语言支持访问修饰符),并且可以直接引用它们。如果B重写A的某些功能,则该语言通常提供调用基类实现的工具(base.Foo()或类似的工具)

继承示例:C#

另一方面,如果您使用组合而不是继承,并且B包含A的一个实例作为类变量,那么您需要创建A的一个对象,并通过该实例引用它的(公共)功能

组合示例:C#


我发现驯服继承复杂性的最佳方法是确保我只从
A
继承
B
,而这实际上是超类的一个特化。在这一点上,我可以从
B
内部调用
A
的方法,就像它们是
B
自己的方法一样,如果
B
有那么我只能假设这一定是有充分理由的

当然,
B
的方法实现在同一对象上调用
a
的实现通常很有用,这通常是因为子类围绕超类的基本定义包装了额外的行为

super.methodName(arg1, ...);

下面是一个快速的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);
    }
}

请注意,访问父类的方法不应该更改。因为您正在扩展,所以不应该说
父::
或任何的内容,除非您重写父方法/函数

在我看来,扩展类可能不是您的最佳选择。类“B”、“C”和“D”如果类“A”确实是该类的扩展,则只应扩展该类,而不仅仅是为了访问某个方法。例如,“Huffy”不应扩展“BrandNames”,因为“Huffy”是一个品牌名称,并且您希望访问“BrandNames”的其中一个方法。“Huffy”应改为扩展“Bicycle”,并实现一个接口,以便可以使用“BrandNames”。这里的另一个好处是(在Java中)可以使用多个接口,但一个类只能扩展一次。如果在示例中,类“B”需要从类“a”访问一个可以工作的方法,但是类“C”需要从类“a”和类“B”访问一个方法'则必须使用类''C'中的接口'.

你能详细解释一下吗?从php.net添加的示例很有意义吗?现在让我们假设如果我没有在
类B
中创建函数,那么我如何直接调用
类A
中的函数,我是否需要在访问
类A
函数之前在
类B
中创建
类A
的实例,即使
class B
正在扩展
class A
您不必创建
class A
的实例来访问这些方法。这样,我就可以直接使用
$this->class A Method
来访问class A函数了?您能详细说明组合部分而不是继承,因为它不是很清楚吗?@Rachel:有了组合,您;r实际上,将对B.Bar()的调用中继到A.Foo()。这通常在A和B不构成“is-A”时使用关系。例如:福特是一辆汽车,所以福特继承了汽车以共享实现;但汽车不是一辆转向器虽然汽车具有使其可转向的特性,但组成比继承更好地反映了这一事实。@Rachel--我添加了一个例子。这有帮助吗?我没有得到两张反对票--有人愿意纠正我犯的错误吗这里?我现在更明白了。
 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()
     }
 }
super.methodName(arg1, ...);
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);
    }
}