C# héritage

Résolu/Fermé
gilles81 Messages postés 67 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 29 juillet 2009 - 26 déc. 2008 à 08:05
gilles81 Messages postés 67 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 29 juillet 2009 - 26 déc. 2008 à 12:26
Bonjour,
j'ai implémenté ceci :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Rayan2
{
class Publication
{
private String title;
private int sale;
private float price;
private int participation;
public String Title
{
get
{
return title;
}
set
{

title = value;
}
}
public int Sale
{
get
{
return sale;
}
set
{

sale = value;
}
}
public float Price
{
get
{
return price;
}
set
{

price = value;

}
}
public int Participation
{
get
{
return participation;
}
set
{
participation = sale * price;
Console.WriteLine("price als float: {0}, price als int: {1}", price, (int)price);


}
}
public override string ToString()
{

return String.Format("{0}\n----------------------\nTitel : {1}\nVerkaufszahlen : {2}\nPreis pro Stück ($) : {3}\nBeteiligungssatz : {4} %", title, sale, price, participation);

}
public virtual float CalculateFee()
{
float calculatefee = (float)(sale * (int)price / 100 * participation);
return calculatefee;

}

}
class Book : Publication
{
private int pages;
public int Pages
{
get
{
return pages;
}
set
{

pages = value;
}
}
public override string ToString()
{
return String.Format("{0}\n----------------------\nTitel : {1}\nVerkaufszahlen : {2}\nPreis pro Stück ($) : {3}\nBeteiligungssatz : {4} %\nPages : {5}", title, sale, price, participation,pages);
}


}
abstract class DigitalMediaj : Publication
{
private const float literalPropertyFee = 10000;
private int runTime;

public DigitalMediaj(int runTime)
{
this.runTime = runTime;
}
public float LiteralPropertyFee
{
get
{
return LiteralPropertyFee;
}
}
private int RuntimeMedium{
get
{
return runTime ;
}
set
{
runTime = value ;
}

}
public override float CalculateFee()
{
float calculatefee = (float)((sale * (int)price / 100 * participation)+(int) LiteralPropertyFee);
return calculatefee;

}
}
class Audio : DigitalMediaj
{





}
public class Movie : DigitalMediaj
{
private float movieRights;
public float MovieRights
{
get
{
return MovieRights;
}
set
{
MovieRights = value;
}
}
public override float CalculateFee()
{
float calculatefee = (float)(((sale * (int)price / 100 * participation) + (int)LiteralPropertyFee)+(int)MovieRights);
return calculatefee;

}
public override string ToString()
{
return String.Format("{0}{1}{2}{3}{4}{5}{6}", title, sale, price, participation, LiteralPropertyFee,MovieRights);
}
}
}



En fait je dois implémenter la méhode CalculateFee() qu'une seule fois , c'est à dire dans la classe Publication dont hérite la class Book et la classe DigitalMediaj. Les classes Audio et Movie heritent de la classe DigitalMediaj. Comment devrais-je utiliser la méthode CalculateFee() dans les autres classes sans la dupliquer.

En plus il ya une erreur de compilation qui persiste: Inconsistent accessibility: base class 'Rayan2.DigitalMediaj' is less accessible than class 'Rayan2.Movie'

merci

2 réponses

scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
26 déc. 2008 à 12:23
Bon voilà j'ai apporter quelques modifications :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Rayan2
{
    class Publication
    {
        private String _title;
        private int _sale;
        private float _price;
        private int _participation;

        public String Title
        {
            get { return _title; }
            set { _title = value; }
        }

        public int Sale
        {
            get { return _sale; }
            set { _sale = value; }
        }

        public float Price
        {
            get { return _price; }
            set { _price = value; }
        }

        public int Participation
        {
            get { return _participation; }
            set
            {
                _participation = (int)(_sale * _price);
                Console.WriteLine("price als float: {0}, price als int: {1}", price, (int)price);
            }
        }

        public override string ToString()
        {

            return String.Format("{0}\n----------------------\nTitel : {1}\nVerkaufszahlen : {2}\nPreis pro Stück ($) : {3}\nBeteiligungssatz : {4} %", Title, Sale, Price, Participation);

        }

        public virtual float CalculateFee()
        {
            float calculatefee = (float)(Sale * (int)Price / 100 * Participation);
            return calculatefee;
        }
    }

    class Book : Publication
    {
        private int _pages;

        public int Pages
        {
            get { return _pages; }
            set { _pages = value; }
        }

        public override string ToString()
        {
            return String.Format("{0}\n----------------------\nTitel : {1}\nVerkaufszahlen : {2}\nPreis pro Stück ($) : {3}\nBeteiligungssatz : {4} %\nPages : {5}", base.Title, base.Sale, base.Price, base.Participation, Pages);
        }
    }

    abstract class DigitalMediaj : Publication
    {
        private const float _literalPropertyFee = 10000;
        private int _runTime;

        public DigitalMediaj(int runTime)
        {
            this._runTime = runTime;
        }

        public float LiteralPropertyFee
        {
            get { return _literalPropertyFee; }
        }

        private int RuntimeMedium
        {
            get { return _runTime; }
            set { _runTime = value; }
        }

        public override float CalculateFee()
        {
            return (base.CalculateFee() + (int)LiteralPropertyFee);
        }
    }

    class Audio : DigitalMediaj
    {

    }

    public class Movie : DigitalMediaj
    {
        private float _movieRights;

        public float MovieRights
        {
            get { return _movieRights; }
            set { _movieRights = value; }
        }

        public override float CalculateFee()
        {
            return (base.CalculateFee() + (int)MovieRights);
        }

        public override string ToString()
        {
            return base.ToString() + String.Format("{0}{1}", base.LiteralPropertyFee, MovieRights); 
        }
    }
}


Sinon je te conseille de remplacer ceci :
        public int Participation
        {
            get { return _participation; }
            set
            {
                _participation = (int)(_sale * _price);
                Console.WriteLine("price als float: {0}, price als int: {1}", price, (int)price);
            }
        }


Par ceci (étant donné que tu ne modifie jamais la valeur de la participation avec value.
        public int Participation
        {
            get { return (int)(Sale * Price); }
        }


Tu peux y rajouter ton affichage console et ainsi supprimer le _participation, comme ça tu aura toujours la valeur de Sale * Price quand tu demandera Participation.
0
gilles81 Messages postés 67 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 29 juillet 2009 1
26 déc. 2008 à 12:26
merci
0