【问题标题】:C# creating a class derived from an abstract and singleton classC# 创建从抽象和单例类派生的类
【发布时间】:2016-12-19 11:50:20
【问题描述】:
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
    // this is my singleton class
}

public abstract class A : Singleton<A>
{
    // this is my base abstract class. 
}

public B : A
{
    // I want this class to be derived from A, also to derive from Singleton and MonoBehaviour
}``

由于 c# 不支持多重继承。我正在尝试创建一个从 A 类和单例类派生的类。当我调用 B 的实例时,它会创建 A 的实例并给出空异常。有解决方案还是我必须使用界面? 提前致谢。

【问题讨论】:

  • 单例并没有给你那么多,只是一个静态成员和一个实例获取器......可以在类中实现它。
  • 一个有趣的阅读:stackoverflow.com/questions/8036883/…
  • Singleton 与其说是一种对象,不如说是一种编码模式。您使用 Singleton 来获得静态对象的“全局”可访问性,同时仍然具有实例的好处。无需创建 Singleton 类来实现这种行为。
  • 要创建一个单例类,您应该将其构造函数设为私有。然后使用非私有属性使用单例模式获取类的实例。像这样public Singleton&lt;T&gt; Instance =&gt; _instance ?? _instance = new Singleton()
  • 确实如此。应该不可能从单例继承,因为这样就可以通过创建没有实现重写的派生类来颠覆单例的意图,从而允许实例化同一类的第二个实例。

标签: c# inheritance singleton multiple-inheritance


【解决方案1】:

第一个问题是:你想在这些课程之间分享什么?

等待这个答案,我会尽可能详细地给你一个通用的解释。

1 - 仅共享方法

如果您只想共享方法,最佳实践是使用接口来根据需要拆分逻辑并将其分配给具体的类:

public interface IInterface1{
//some methods
}


public interface IInterface2{
//some methods
}

public class MyClass : IInterface1, IInterface2{

}

MyClass 可以是抽象的,如果你愿意,你也可以将一些方法作为虚拟方法来覆盖它们

2 - 共享方法和属性

您将按照相同的方式进行操作,但需要将接口添加到正确的类中

 public interface IInterface1{
    //some methods
    }


public interface IInterface2{
//some methods
}

public abstract class MyAbstractClass {
//some methods and properties
}

 public class MyClass : MyAbstractClass, IInterface1, IInterface2{

    }

您可以将接口添加到 MyAbstractClass 而不是 MyClass,这取决于您的架构和您的需求

3 - 单例

对于单例,如 cmets 中所说,这只是获得全局可访问性的一种方式,因此您需要在 "last" 类中执行此操作,此处为 MyClass强>

我希望我对这个解释的表达足够正确,我希望这个答案对你有所帮助。

【讨论】:

  • 感谢您的解释。我将在类之间共享方法和属性。所以我会选择你的第二个选项。但这就是我的问题开始的地方,我也想从另一个单例类派生该类。但我认为这是不可能的,因为我理解它从单例模式返回一个抽象引用。您建议,要使该类也单例,我必须在 MyClass 中实现它,对吗?
  • 问题是抽象类可以是单例的,因为抽象类不能被实例化。此外,您将至少只使用您继承的类,因此这是需要单例的。如果单例是一个已经由其他人开发的类,我认为最好的是将你需要的东西隔离到一个超类中,并从单例和你的新类继承它
猜你喜欢
  • 2013-11-30
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 2015-03-23
相关资源
最近更新 更多