当前位置: 首页 > 面试题库 >

多态性和接口-澄清吗?

马冯浩
2023-03-14
问题内容

(学问)

根据 维基百科
,有3种类型的多态性:

  • 临时多态性

指可以应用于不同类型参数的多态函数,但其​​行为取决于所应用参数的类型而有所不同

换句话说:重载:

function Add( x, y : Integer ) : Integer;
...
function Add( s, t : String ) : String;
  • 参数多态性

允许以通用方式编写函数或数据类型,以便它可以相同地处理值而无需依赖其类型

换句话说:泛型

范例:

class List<T> {
    class Node<T> { ...
  • 亚型多态性

允许将函数编写为采用某种类型T的对象,但如果传递了属于类型T的子对象S的对象,则该函数也可以正常工作

(最常见的用法)

范例:

abstract class Animal {
    abstract String talk();
}

class Cat extends Animal {
    String talk() {
        return "Meow!";
    }
}
...

另一个例子 :

class Animal
{
    public virtual void eat()
    {
        Console.Write("Animal eating");
    }
}
class Dog : Animal
{
    public override void eat()
    {
        Console.Write("Dog eating");
    }
}

太好了。

现在,我想向您展示interface的定义:

接口 -接口定义可由类和结构实现的 协定
。接口可以包含方法,属性,事件和索引器。接口不提供其定义的成员的实现,而只是指定必须由实现该接口的类或结构提供的成员。

大。

题:

看下面的伪代码:

Dog implements IWalk {...}
Cat implements IWalk {...}
Array[IWalk] = [new Dog(),new Cat()]
foreach item in array :  item.walk();
  • 这是多态行为( 在每个不同的对象上调用walk() )吗?

恕我直言,事实并非如此。为什么呢?因为它不对应于上述任何Wiki类别。

我相信这是纯粹的编码原则,即我可以通过不同的眼镜查看对象-不像上面提到的3个范例那样创建/更改功能

我对吗 ?这是多态行为吗?


问题答案:

我认为您在正确的轨道上。接口本身不是多态的。他们将多态性形式化。它们允许您以声明的方式而不是实现来定义多态行为。我喜欢将Interfaces视为俱乐部中的佼佼者。他们只是确保每个人都遵循多态规则。

在您的示例中,实际的多态行为与接口本身无关,而与共享的方法有关。walk方法适合于子类型多态性示例。接口本身只是按照合同规定,必须让子对象走路。

更新:

基于评论:只是为了清楚起见-通过对象实现的不同接口查看对象-也是多态行为吗?

接口本身只是一个合同(您已在问题中添加了合同)。多态性来自合同中的方法。“多态类型是一种类型,其操作也可以应用于某些其他类型的值”(来自维基百科)。接口(合同)是包含服务或使用方法(条款)的协议。因此,每个合同都持有属于多态行为的条款。

Dog implements IWalk, ITalk, IAnimal
{
    //concrete implementation
}

IWalk 
{
    void walk();
}

ITalk
{
    String talk();
}

IAnimal
{

}

我对Java感到生疏,因此如果语法上不正确,请考虑使用此伪代码。

在这种情况下,IAnimal只是不包含多态行为的合同。IWalk和ITalk促进多态性。



 类似资料:
  • 问题内容: 我只是在某处读到,具有与常见项目常量的接口是不好的做法,也称为“ 常量接口反模式”。如果我正确理解这一点,提供的原因是,一旦实现,该类将向公众公开这些常量。 好吧,我首先不理解“实施”的必要性。是否可以直接使用这些静态常量?那么,为什么我必须经历什么时候才能做类似的事情: 我将不胜感激任何指导,以帮助我更多地了解这一点。 问题答案: 我意识到……如果需要的话,该接口可以由个人实现,从而

  • 我对Firebase定价模型有点困惑,特别关注的是连接或更准确地说是并发连接。 让我们举一个iOS移动应用程序FanZONE的例子: 用户将在足球比赛期间创建组。他们将对实际比赛进行评论,评论将立即显示在每个会员屏幕上。 这种情况是否意味着参与评论/查看的每个用户都会对一个连接计数 那么,如果一个组包含100个积极关注屏幕并不时发表评论的用户,那么每90分钟是否有100个连接 后台有应用程序的用户

  • 给定一个非空字符串s和一个包含非空单词列表的字典字词,确定s是否可以被分割成一个或多个字典单词的空格分隔序列。您可以假定字典不包含重复的单词。 例如,给定s=“leetcode”,dict=[“leet”,“code”]。 返回true,因为“leetcode”可以分段为“leetcode”。 朴素解给出如下: 时间复杂度被列为O(n^n),因为这是递归树的大小。我完全同意递归树的最后一层有n^n

  • 请你澄清我的疑问: WebDriver驱动程序=new ChromeDriver(); 我们知道WebDriver是一个in接口,Chrome驱动程序是类,它实现了 Web驱动程序接口。 这意味着,无论接口中定义了什么方法,我们都只是用Chrome驱动程序类重写了相同的方法。 现在,如果我们像上面那样编写代码。。。。我们仍然可以运行代码。 现在我的疑问是: 我们这里不涉及Webdriver接口。但

  • 我正纠结于一个关于Flink的Kafka的消费者连接器的事件时间的问题。引用Flink doc 自从Apache Kafka 0.10+以来,Kafka的消息可以携带时间戳,指示事件发生的时间(参见Apache Flink中的“事件时间”)或消息被写入Kafka代理的时间。 Kafka消费者不会发出水印。 一些问题和问题浮现在我的脑海中: > 我如何知道它的时间戳是发生的时间还是写给Kafka经纪

  • 问题内容: 我有一张桌子Table1 当我使用以下查询查询该表时 我得到的输出为 但是以同样的方式,当我使用以下查询时,我没有任何输出。 有人请给我指导,为什么它会那样工作,以及如何使用rownum。 问题答案: 汤姆回答了许多与Oracle有关的问题 简而言之,在应用where子句之后和应用order by子句之前,rownum可用。 在RowNum = 2的情况下,where子句中的谓词将永远