调用没有实现的抽象方法

Calling abstract method with no implementation

我正在阅读 Kudan for Unity 示例项目 (Kudan 是 AR 的框架)

在文件 KudanTracker.cs 中,他们使用了一个名为 _trackerPlugin

TrackerBase 对象
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

#if UNITY_EDITOR
using UnityEditor;
#endif

namespace Kudan.AR
{
    [DisallowMultipleComponent]
    [RequireComponent(typeof(Camera))]
    [AddComponentMenu("Kudan AR/Kudan Tracker")]
    public class KudanTracker : MonoBehaviour
    {
        protected TrackerBase _trackerPlugin;
        public bool ArbiTrackIsTracking()
            {
                return _trackerPlugin.ArbiTrackIsTracking();
            }
    ...
}   

所以我转到 TrackerBase.cs 查看 ArbiTrackIsTracking() 的实现,但我发现的是:

using UnityEngine;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace Kudan.AR
{
    /// <summary>
    /// Base class for the tracker plugin.  This abstracts the native plugin for each operating system.
    /// </summary>
    public abstract class TrackerBase : ITracker
    {
         public abstract bool ArbiTrackIsTracking ();
         ...
    }
}

怎么可能调用从未实现过的方法?
实现隐藏在哪里?
谢谢

没有任何实现就无法调用抽象方法。

正如 TrackerBase class 的评论所说,每个 OS 的 Tracker class 是不同的,所以寻找 TrackerWin.cs 或类似的

这是完全正常的。

这种行为是正常的,IF class 已使用非抽象版本的 Trackerbase 正确实例化。

但是您没有提供相关的实例化代码,所以我无法验证您提供的代码示例是否正确实例化,除非我自己去获取该代码。

理论上,实例化代码可能如下所示:

//Constructor
public KudanTracker(TrackerImplementation track) {
    _trackerPlugin = track;
}

IF代码有正确的实例化,如上,你没问题。

他们可能会处理它,就像微软处理 XmlReader:

您正在为您正在使用的对象使用派生 class,但通过其基础 class 访问它。

XmlReader 中是这样的:

XmlReader reader = XmlReader.Create("something");

然后您可以通过

读取xml文件中的每个元素
reader.Read();

但是如您所见,XmlReader.Read() 甚至没有实现:Source

相反,XmlReader.Create() 创建了一个 XmlTextReader,它继承自 XmlReader 并实现了所有内容,尤其是 Read() 的处理方式。

我猜他们在插件中也是这样做的。请参阅 API 中的此处说明 "Implemented in Tracker" KudanAR - Unity Plugin V1.4