두 가지 문제점이 있습니다. 하나는 추상 싱글 톤 클래스를 갖기 위해 노력하고 있는데 싱글 톤 기능 + 약간의 추가 기능이 있지만이 클래스는 일반 (관련없는 싱글 톤)이기도합니다. 그것의 자식 클래스 중 하나가 코드를 다시 작성하지 않고 싱글 톤 기능을 상속 받기를 원하며 제네릭 형식에 의존하는 나머지 기능도 필요합니다.싱글 톤, 일반 및 상속 - 모든 자식 클래스가 싱글 톤 기능을 상속받습니다.
두 번째 문제는, 추상 클래스는 문자열 값을 받아야 기본값이 아닌 생성자를 가지고 있습니다. 이 문자열은 자식 클래스의 클래스 (추상 calss를 상속받은 클래스)에 의해 결정될 수 있습니다. 모든 파생 클래스의 따라서 비 추상적 인 인스턴스를 구현 할 수 있도록
- 는 문자열 매개 변수를 반환하는 추상 클래스에 추상 정적 메서드를 추가합니다 다음과 같이
내 생각은이 곳을 처리하는 수업은 잘될 것입니다. 정적 메서드는 추상이 될 수 없으므로 불가능합니다.
- 문자열을 반환하는 정적 메서드로 인터페이스를 만들고 해당 제네릭 형식이 해당 인터페이스를 상속하는지 확인하십시오. 그런 다음 싱글 톤을 인스턴스화하면
T.GetTheString()
을 호출하여 생성자에 매개 변수로 전달합니다. 인터페이스에는 정적 메서드가 없으므로 불가능합니다.
아이디어가 있으십니까? 여기
내 문제에 대해 설명 몇 가지 간단한 코드입니다 :public abstract class NamedObject<T> {
private static NamedObject<T> _instance;
public static NamedObject<T> Instance {
get {
if (_instance == null) {
_instance = new NamedObject<T>("Need to determine this string from the non-abstract child class of NamedObject");
}
return _instance;
}
}
private string objectName;
public NamedObject(string objectName) {
this.objectName = objectName;
}
public string GetFullName() {
return objectName + "(" + GetClassName() + ")";
}
protected virtual string GetClassName() {
return typeof(T).ToString();
}
}
주 내가 GetClassName()
에 대한 일반 T를해야하고, 싱글 톤의 인스턴스를 생성하는 점에 유의, 나는의 정적 메서드를 호출해야 (불가능한 것 같다)이 클래스
편집을 상속 자식 클래스 : 더 나은 내 문제를 반영하기 위해 질문을 업데이트했습니다.
편집 : 도움을 주셔서 감사합니다. 두 번째 문제는 기본 생성자를 사용하고 자식 클래스의 비 정적 메서드 (기본 클래스의 추상)에서 생성자 내의 매개 변수로 간주되는 문자열을 가져 오는 것입니다.
는 또한, 싱글 상속의 내 전체 아이디어는 내가 롭 린든의 대답에 감사를 해결하기 위해 관리하는 잘못이었다. 그래서 때
public sealed class MyNamedObject : NamedObject<MyNamedObject, MyClass>
{
public MyNamedObject() : base() {
}
protected override string GetObjectName() {
return "MyName";
}
}
:
public abstract class NamedObject<ME, T> where ME : NamedObject<ME, T>, new()
{
private static NamedObject<ME, T> _instance;
public static NamedObject<ME, T> Instance {
get {
if (_instance == null) {
_instance = new ME();
}
return _instance;
}
}
private string objectName = "test";
public NamedObject() {
this.objectName = GetObjectName();
}
public string GetFullName() {
return objectName + "(" + GetClassName() + ")";
}
protected virtual string GetClassName() {
return typeof(T).ToString();
}
protected abstract string GetObjectName();
}
그리고 자식 클래스 :
여기에 최종 코드 (나는 ... 이것은 단지 단순화 된 버전입니다, 그것은 이해가되지 않습니다 알고)입니다 처음으로 MyNamedObject.Instance
을 호출하면 MyClass
으로 NamedObject()
생성자가되고 T
으로 objectName
매개 변수는 자식 클래스 MyNamedObject
에 정의 된대로 "MyName"
이됩니다.
정확히 내가 무엇을 찾고 있었습니까. 도움을 주신 모든 분들께 감사 드리며 매우 도움이되었습니다.
여기서 무엇을하려고합니까? 추상 일반 싱글 톤? 새 NamedObject을 만들 수 없습니다. 추상입니다. 추상적 싱글 톤은 무엇을 의미합니까? –
오른쪽 ... 내가 잘못한 또 다른 일 :). 내 목표는 부모 클래스를 갖는 것이고 모든 자식 클래스는 자식 클래스 당 singletone 코드를 다시 작성하지 않고도 싱글 톤이 될 것입니다. – tbkn23
필수 [싱글 톤은 나쁜 링크 임] (http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons). – Mike