调用没有实现的抽象方法
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
我正在阅读 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