-1

我正在阅读一个 Kudan for Unity exaple 项目(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 ();
         ...
    }
}

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

4

3 回答 3

2

他们可能会处理它,就像微软处理的那样XmlReader

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

XmlReader它是这样的:

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

然后您可以通过以下方式读取 xml 文件中的每个元素

reader.Read();

但正如你所看到XmlReader.Read()的,甚至没有实现:Source

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

我猜他们在插件中做同样的事情。请参阅此处在 API 中声明“在 Tracker 中实现” KudanAR - Unity Plugin V1.4

于 2017-07-11T18:05:42.267 回答
0

没有任何实现就不可能调用抽象方法。

正如 TrackerBase 类的评论所说,每个操作系统的 Tracker 类都不同,所以寻找 TrackerWin.cs 或类似的东西

于 2017-07-11T18:02:53.030 回答
0

这是完全正常的。

如果使用 Trackerbase 的非抽象版本正确实例化类,这种行为是正常的。

但是,您没有提供相关的实例化代码,因此我无法验证您提供的代码示例是否已正确实例化,而我自己不会获得该代码。

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

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

如果代码具有正确的实例化,例如上面,你很好。

于 2017-07-11T18:03:52.497 回答