Vererbung und überscheiben statischer Daten?



  • Hallo Leute,

    nehmen wir an, ich habe eine Klasse "Base", welche einen statische Varaible hat, die meta informationen entsprechen dem Types (Base) enthätlt.

    Leite ich nun von Base ab, und die Meta Informationen erweitern bzw. verändern sich, bleibt mir ja nix andere überig mit dem "new" schlüssewort die statische Varaible zu überschreiben.

    Grund hierfür ist, das die Meta informationen immer Typabhängig u. nicht instance abhängig sind, deswwegen das static.

    Ich könnte das mit nem Attribute machen, aber ich frage mich ob es auch irgendwie schön lösbar is?

    grüße



  • Hallo,

    dir ist schon bewusst das statische Variablen überhaupt nicht vererbt werden oder? Deshalb versteh ich nicht wieso du da was mit new überdecken (das ist kein überschreiben) musst.

    Die Attributidee ist doch gar nicht so schlecht. Was gefällt dir daran nicht?



  • Ja es is mir prinzipell bewußt das statische variablen nich überschrieben werden können, aber wenn ich das "new" schlüsselwort in der abgeleiten Klasse verwende, müsste sie doch überschrieben werden

    class Base
    {
       public static int S{get{...};}
    }
    
    class Dummy : Base
    {
     public new static int S{get{...}}
    }
    


  • NullBockException schrieb:

    Ja es is mir prinzipell bewußt das statische variablen nich überschrieben werden können, aber wenn ich das "new" schlüsselwort in der abgeleiten Klasse verwende, müsste sie doch überschrieben werden

    class Base
    {
       public static int S{get{...};}
    }
    
    class Dummy : Base
    {
     public new static int S{get{...}}
    }
    

    Falls mal wie bei C++ auf die statische Methode über das Objekt ansprechen darf, dann möge es funktionieren, falls jemand daran gedacht hat. Aber es geht einfach nicht

    class Base
        {
            public static int v = 1;
        }
    
        class Extended : Base
        {
            public new static int v = 12;
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var b = new Base();
                var e = new Extended();
                Console.WriteLine(Base.v);
                Console.WriteLine(Extended.v);
                Console.WriteLine(b.v); // error
                Console.WriteLine(e.v); // error
            }
        }
    


  • Ich verstehe ehrlich gesagt das Problem nicht.



  • hustbaer schrieb:

    Ich verstehe ehrlich gesagt das Problem nicht.

    Weil's kein Problem gibt. 🙂 Nur wein verwirrter Threadstarter - nicht böse gemeint!



  • hustbaer schrieb:

    Ich verstehe ehrlich gesagt das Problem nicht.

    er hat eine Basis Klasse die liefert eigentlich Meta-Daten ... dann hat er mehrere Kind-Klasse die natürlich andere Meta-Daten haben ... ABER diese Meta-Daten sind nicht von der Instanz abhängig sondern von der Klasse ... und was von der Klasse abhängig ist macht man statisch - was aber nicht vererbt wird ... er will aber von der Basis-Klasse auf die statische Meta-Daten der Klasse über die Instanz zugreifen (oder so ähnlich)



  • Eine Möglichkeit würde dies sein:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        interface IMetaData<M>
        {
            M MetaDesciption { get; }
        }
    
        interface DefaulMetaData : IMetaData<DefaultMeta>
        {
    
        }
    
        class DefaultMeta
        {
            private String author;
            private int version;
    
            public DefaultMeta(String author, int version)
            {
                this.author = author;
                this.version = version;
            }
    
            public String Author
            {
                get { return author; }            
            }
    
            public int Version
            {
                get { return version; }
            }
        }
    
        class MyType : DefaulMetaData
        {
            private static DefaultMeta meta = new DefaultMeta("zeus", 0);
    
            public DefaultMeta MetaDesciption
            {
                get { return meta; }
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var obj = new MyType();
                System.Console.WriteLine(obj.MetaDesciption.Author);
                System.Console.WriteLine(obj.MetaDesciption.Version);
            }
        }
    }
    

    Aber ohne konrekt zu werden, was du brauchst ist sehr schwirig.



  • mogel schrieb:

    hustbaer schrieb:

    Ich verstehe ehrlich gesagt das Problem nicht.

    er hat eine Basis Klasse die liefert eigentlich Meta-Daten ... dann hat er mehrere Kind-Klasse die natürlich andere Meta-Daten haben ... ABER diese Meta-Daten sind nicht von der Instanz abhängig sondern von der Klasse ... und was von der Klasse abhängig ist macht man statisch - was aber nicht vererbt wird ... er will aber von der Basis-Klasse auf die statische Meta-Daten der Klasse über die Instanz zugreifen (oder so ähnlich)

    Dann soll er statische Variablen machen, und diese über nicht-statische Properties zur Verfügung stellen. Viel einfacher gehts ja wohl nicht.
    Oder über Reflection gehen - mit Attributes oder auch ohne.



  • Hab es jetzt so mal gelöst:

    public  interface IMetaDataClass
    {
      MetaData[] Meta{get;}
    }
    	public abstract class Base
    	{
    		public static MetaData[] Meta() { return null; }
    	}
    
    	public abstract class Base<TVertexDec> : Base
    		where TVertexDec : IMetaDataClass, new()
    	{
    		private static IVertexDefinition _decInstance;
    		public new static MetaData[] Meta()
    		{
    			if (_decInstance == null)
    				_decInstance = new TVertexDec();
    			return _decInstance.Meta;
    		}
    
    	}
    
    public MyClassMetaData :IMetaDataClass
    {
    .....
    }
    public MyClass<MyClassMetaData>
    {
    .......
    }
    


  • NullBockException schrieb:

    Hab es jetzt so mal gelöst:

    public  interface IMetaDataClass
    {
      MetaData[] Meta{get;}
    }
    	public abstract class Base
    	{
    		public static MetaData[] Meta() { return null; }
    	}
    
    	public abstract class Base<TVertexDec> : Base
    		where TVertexDec : IMetaDataClass, new()
    	{
    		private static IVertexDefinition _decInstance;
    		public new static MetaData[] Meta()
    		{
    			if (_decInstance == null)
    				_decInstance = new TVertexDec();
    			return _decInstance.Meta;
    		}
    
    	}
    
    public MyClassMetaData :IMetaDataClass
    {
    .....
    }
    public MyClass<MyClassMetaData>
    {
    .......
    }
    

    Ich frag mich was dies hier löst? IMetaDataClass und Base haben die Intension das gleiche zu machen. Du weisst bloß nicht ob du die Information zum Type bereitstellen willst oder zum Objekt.

    Die zweite Base Klasse ist ja der Chaos. Sieht so aus ob du die Informationen alle Statisch Codeieren willst, dann kannst du das mit dem Interface und Abstrakte Klassen sparen. Dein Zugriff auf die Information ist immer

    Base<TVertexDec>.Meta();
    

    eh.. nein Stimmt nicht, da ist keine Klasse die von Base<T> erbt. Hmm. Also sehr verwirend.



  • Ich verstehe das Problem immer noch nicht. Und auch nicht was diese "Lösung" darstellen soll.



  • hustbaer schrieb:

    Ich verstehe das Problem immer noch nicht. Und auch nicht was diese "Lösung" darstellen soll.

    Dabei ist der Grund doch gleich im ersten Posting:

    NullBockException schrieb:

    Ich könnte das mit nem Attribute machen, aber ich frage mich ob es auch irgendwie schön lösbar is?

    Klassisches Noob-Problem... Imho sollte man in den ersten 5 Jahren solche Worte wie "schön", "elegant", "clever" etc aus dem Wortschatz streichen und sich erstmal auf wesentlichere Aspekte konzentrieren.



  • Wieso "schön", "elegant", "clever" sind Lösungen, wenn man sich greade auf wesentlichere Aspekte konzentriert. 🙂



  • wenn die statische Variable doch sowieso IMMER verändert werden soll... warum nicht einfach eine neue erstellen


Anmelden zum Antworten