【问题标题】:Overriding methods from Library Project覆盖图书馆项目的方法
【发布时间】:2014-02-26 14:14:58
【问题描述】:

我正在开发 Windows Phone 8 应用程序。

我有一个 Windows Phone 类库项目(称为基)和 Windows Phone 应用程序(称为子)。

在我的 Base 项目中,我有一个包含方法和静态变量的类。

例如:

 Class Settings
    {

    public static string AppName = "Base";

    public virtual List<String> TabDetails()
            {
                List<String> TabDetails = new List<string>();
                helpTabDetails.Add("AAA");
                helpTabDetails.Add("BBB");
                return helpTabDetails;
            }

    } 

现在在我的子应用程序中,我只是链接这个类(通过在拖放时按 ALT,我们可以链接类图像等......我没有在参考文件夹中添加参考)。

现在在我的 Base 中,这些是我的应用程序的默认设置,但如果需要,我想更改这些设置,如果我不需要更改,那么默认设置应应用于我的子应用程序。

注意:我的 Base 将包含与我的应用相关的所有类,但我的子应用将仅包含应用特定的设置类。

我怎样才能做到这一点?

编辑

更具体:

在我的基地:

 Class Demo : Settings
    {

    AppName = "XYX"

   override TabDetails() and give new implemntation

    }

现在在我的子应用程序中,如果我要覆盖这些静态变量或方法,那么它应该选择这些值,但是如何实现呢?

【问题讨论】:

  • 如果“需要”?在编译时或运行时。通常如果您使用文件链接,那么您使用#ifdef 为不同的目标提供不同的实现。这仅适用于编译时间。
  • 如果你想在运行时进行检查,那么只需让你的 lib 项目中的函数期望一个设置接口。然后传递接口或传递 null 以在运行时使用应用程序项目中的默认值。如果您使用 IoC,那么它会变得更加简单。但概念仍然成立。
  • @Viv 我没明白你的意思,你能给我举个例子吗
  • 好的,刚刚看到您的编辑,这不是我认为您想要的。好吧,如果您在Demo 类中覆盖TabDetails(),则Demo 类的任何对象在调用TabDetails() 时都应该返回被覆盖的方法数据。这不是你现在得到的还是我仍然不明白你的问题是什么
  • 是的,它会给我,但实施来自 BASE 而不是来自 CHILD,我想在子应用程序中做同样的事情

标签: c# wpf windows-phone-8 windows-phone class-library


【解决方案1】:

好的,经过长时间的交谈,终于得到了 OP 正在寻找的要求。

简单来说:

  • 他有一个叫AppSettings的接口
  • 一个名为DefaultSettings 的类实现了这个接口
  • 另一个名为CustomSettings 的类可能或不能出现在项目中,它也将实现AppSettings 接口

问题是如何检查和使用ChildSettings,如果存在则使用DefaultSettings

解决方案

使用反射并检查类型是否存在以及是否可用。

AppSettings appSettings;
var customSettingsType = Type.GetType("POCChild.ChildSettings");
if (customSettingsType == null)
  appSettings = new DefaultSettings();
else
  appSettings = (AppSettings)Activator.CreateInstance(customSettingsType);

Debug.WriteLine(appSettings.getAppName());

其中"POCChild.ChildSettings"Namespace.ClassName

【讨论】:

  • 有空时请联系我
  • 如果你有空就看看这里stackoverflow.com/questions/22094143/…
  • @user2056563 抱歉,我被绑了一段时间。尽量不要发布其他主题问题,因为在另一个线程上寻求帮助。它有助于将信息保留在与主要问题相关的页面上。如果您发布了问题,我相信有人会发现它并最终为您提供帮助,同时希望您也尝试自己解决问题。
【解决方案2】:

好吧,覆盖属性值而不是函数。在 Base 类中使用以下代码:

class Settings
{
    public virtual string AppName
    {
        get { return "Base"; }
    }

    public virtual List<String> TabDetails()
        {
            List<String> TabDetails = new List<string>();
            helpTabDetails.Add("AAA");
            helpTabDetails.Add("BBB");
            return helpTabDetails;
        }

} 

class Demo : Settings
{
    public override string AppName
    {
        get { return "XYX"; }
    }
}

【讨论】:

  • 孩子班怎么样
  • Demo 类是 Settings 的子类,您可以将其放入应用程序中。
  • 好的,在这种情况下,假设我在 Base 中有一个扩展设置的 A 类,我可以覆盖它的值吗?如果我不覆盖它,它会采用默认值吗?
  • 也请看这里,我找到了一个灵魂,但它没有完成它的错误stackoverflow.com/questions/22060464/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多