调用没有实现的抽象方法

时间:2017-07-11 17:56:42

标签: c# .net unity3d abstract kudan

我正在阅读一个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 ();
         ...
    }
}

如何调用从未实现的方法?
实施隐藏在哪里?
谢谢

3 个答案:

答案 0 :(得分:2)

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

一样

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

XmlReader中它是这样的:

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

然后你可以通过

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

但正如您所见,XmlReader.Read()甚至未实施:Source

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

我猜他们在插件中也是这样做的。请参阅API中所述的API&#34;在Tracker中实施&#34; KudanAR - Unity Plugin V1.4

答案 1 :(得分:0)

在没有任何实现的情况下调用抽象方法是不可能的。

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

答案 2 :(得分:0)

这是完全正常的。

此类行为是正常的, IF 该类已使用非抽象版本的Trackerbase正确实例化。

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

理论上,实例化代码可能看起来像这样:

{{1}}

IF 代码有适当的实例化,如上所述,你很好。