Avatar billede pnr Nybegynder
20. december 2010 - 13:48 Der er 7 kommentarer og
1 løsning

Hjælp til generic og nedarvning

Jeg har en masse klasser bestående af attributter med dertilhørende get og set metoder. på nogle af disse, har jeg i nogle tilfælde brug for at udvide dem med et par ekstra attributter. Det vil jeg så gøre ved at lave en klasse som nedarver fra en Generisk klasse, men hvordan gør man det?

Mit eneste bud er nedenstående som ikke virker.
public class ItemExtension<T> : T
{
  ......
}

På forhånd mange tak for hjælpen!
Avatar billede bvli Praktikant
20. december 2010 - 13:54 #1
Jeg regner med, at du mener properties i stedet for attributter.

Nedarve fra en generisk klasse:

public class ExtendedClass<T> : BaseClass<T> {

}

Eller:

public class ExtendedStringClass : BaseClass<string> {

}
Avatar billede pnr Nybegynder
20. december 2010 - 14:43 #2
Hej bvli og mange tak for din kommentar!

Jeg tror ikke at jeg har formuleret mig rigtigt, beklager. Her kommer et lille eksempel:

public class Vare
{
        public int VareId { get; set; }
        public string VareTekst { get; set; }
}

public class Kunde
{
        public int KundeId { get; set; }
        public string Note { get; set; }
}

nu vil jeg gerne lave en klasse som kan nedarve for begge ovenstående klasser og evt. flere.

public class ExtendedClass<T> : ???{

}

Håber at det give mening :-)
Avatar billede arne_v Ekspert
20. december 2010 - 14:56 #3
C# tillader ikke at en klasse arver fra flere klasser.

Og naeppe heller i denne variant.
Avatar billede arne_v Ekspert
20. december 2010 - 14:57 #4
Enten skal din Vare og Kunde klasse arve fra en faelles klasse med den faelles funktionalitet.

Eller saa skal du til at rode med noget AOP/dynamisk proxy.
Avatar billede pnr Nybegynder
20. december 2010 - 15:02 #5
Træls...

Mange tak for kommentarene arne_v, smid et svar så er der point!
Avatar billede arne_v Ekspert
22. december 2010 - 03:25 #6
Her er et super skummelt eksempel med Castle DynamicProxy.

using System;
using System.Reflection;

using Castle.Core;
using Castle.Core.Interceptor;
using Castle.DynamicProxy;

namespace E
{
    // this is what we have
    public class C1
    {
        public void M1()
        {
            Console.WriteLine("C1 M1");
        }
    }
    public class C2
    {
        public void M2()
        {
            Console.WriteLine("C1 M1");
        }
    }
    // this is what we need to have to extend both C1 and C2
    public class CX
    {
        public void MX()
        {
            Console.WriteLine("CX MX");
        }
    }
    // helper stuff
    public interface I1
    {
        void M1();
    }
    public interface I2
    {
        void M2();
    }
    public interface IX
    {
        void MX();
    }
    public interface IA : IX,I1,I2
    {
    }
    public class C1D : C1, I1
    {
    }
    public class C2D : C2, I2
    {
    }
    public class CXD : CX, IX
    {
    }
    public static class ProxyHelper
    {
        public static TA CreateWrapper<TXC,T1C,T2C,TA>(this ProxyGenerator gen) where T1C : new() where T2C : new()
        {
            ProxyGenerationOptions opt = new ProxyGenerationOptions();
            opt.AddMixinInstance(new T1C());
            opt.AddMixinInstance(new T2C());
            return (TA)gen.CreateClassProxy(typeof(TXC), new Type[] { typeof(TA) }, opt);
        }
    }
    // demo
    public class Program
    {
        public static void Main(string[] args)
        {
            ProxyGenerator gen = new ProxyGenerator();
            IA o = gen.CreateWrapper<CXD,C1D,C2D,IA>();
            o.M1();
            o.M2();
            o.MX();
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
22. december 2010 - 03:25 #7
og et svar
Avatar billede pnr Nybegynder
22. december 2010 - 06:35 #8
Mange tak for det Arne!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester