2016-12-19 10 views
1
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 и singleton. Когда я вызываю экземпляр B. Он создает экземпляр A и дает пустое исключение. Есть ли решение для этого или мне нужно использовать интерфейс? Спасибо заранее.C# создание класса, полученного из абстрактного и одноэлементного класса

+0

singleton не дает вам столько, просто статический член и экземпляр getter ... может просто реализовать это в классе. – Jonathan

+1

Интересное чтение: http://stackoverflow.com/questions/8036883/can-i-define-an-abstract-class-for-all-derived-singletons-in-this-way?rq=1 – spender

+3

Singleton isn ' t тип объекта, так как он является шаблоном кодирования. Вы используете Singleton, чтобы получить «глобальную» доступность статических объектов, сохраняя при этом все преимущества экземпляров. Нет необходимости создавать класс «Singleton» для реализации такого поведения. – Abion47

ответ

3

Первый вопрос:: Что вы хотите разделить между этими классами?

Ожидая ответа, я попытаюсь дать вам общее объяснение с максимально возможной детализацией.

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 - Singleton

Для одноточечного, как говорят в комментариях, это лишь способ получить глобальный доступ, так что вы должны сделать это в вашем «последнего» класса, здесь MyClass

Я надеюсь, я выразил myselft достаточно правильно для этого объяснения, и я надеюсь, что этот ответ поможет вам.

+0

Спасибо за объяснение. Я буду делиться методами и свойствами между классами. Поэтому я поеду с вашим вторым вариантом. Но вот где моя проблема начинается, я хочу получить этот класс из другого класса singleton. Но я думаю, что это невозможно, поскольку я понимаю, что он возвращает абстрактную ссылку из одноэлементного шаблона. Вы полагаете, что для того, чтобы сделать этот класс также singleton, я должен реализовать его внутри MyClass, правильно? – mcelik

+0

Дело в том, что абстрактный класс может быть одноточечным, потому что абстрактный класс не может быть инстанцирован. Кроме того, вы будете использовать, по крайней мере, только ваш унаследованный класс, так что это тот, который должен быть singleton. Если singleton - это класс, который уже разработан кем-то другим, я считаю, что лучше всего изолировать то, что вам нужно, в суперкласс и наследовать его от синглтона и вашего нового класса – OrcusZ

Смежные вопросы