The constructor of the child class "caesar" gives an error. It says that name, type is inaccessible due to its protection level. How come? As this is a child class derived from "Cipher" class it shouldn't give an error like this. How can I overcome this situation. But I want those variables to be private. I don't want to change them as public.
***The second code example works. Can anybody see a difference?
namespace Encrypter
{
class Cipher
{
public Cipher(string name, string type)
{
setName(name);
setType(type);
}
private string name;
private string type;
public void setName(string newName)
{
name = newName;
}
public string getName()
{
return name;
}
public void setType(string newType)
{
type = newType;
}
public string getType()
{
return type;
}
public string encrypt(string text)
{
return text;
}
public string decrypt(string text)
{
return text;
}
}
}
namespace Encrypter
{
class Caesar : Cipher
{
private int shiftamount;
private string shiftdirection;
public Caesar(int shiftamount, string shiftdirection) : base(name, type)
{
setShiftamount(shiftamount);
setShiftdirection(shiftdirection);
}
public void setShiftamount(int newShiftamount)
{
shiftamount = newShiftamount;
}
public int getShiftamount()
{
return shiftamount;
}
public void setShiftdirection(string newShiftdirection)
{
shiftdirection = newShiftdirection;
}
public string getShiftdirection()
{
return shiftdirection;
}
}
}
----------------------------- New Edit ----------------
class MyFile
{
public MyFile(int id, string name, int size, string type)
{
setId(id);
setName(name);
setSize(size);
setType(type);
}
private int id;
private string name;
private string type;
private int size;
class Movie : MyFile
{
private string director;
private int release_year;
public Movie(string director, int release_year, int id, string name, int size) : base( id, name, size, "m")
{
setDirector(director);
setRelease_year(release_year);
}
private
means that only the declaring class can access the members (meaning that inherited types cannot, either).protected
means that the declaring class and any descendants can access the members, but types outside of those cannot.On a different note, getter and setter functions are generally not used in .NET languages. Properties encapsulate this functionality and are what should be used instead. For example;
It looks like you have made a mistake in defining the derived class constructor. If you want to get
name
andtype
values to the superclass, you'll have to pass them in as additional constructor arguments (for a total of 4 arguments in the derived class constructor.) For example, changing it to this should work:There are a number of other strategies you could take.
The problem is the
private
fields name and type - the child class cannot access them unless they are marked asprotected
. What your really want I suspect isPrivate members cannot be accessed from derived classes. protected and public can. You must make them protected. This way, only the class and its "children" will have access.
Summary of access rights:
private:
can be accessed only from that class methods, nothing elseprotected:
can be accessed from that class's and its children's methodsinternal:
can be accessed only from methods within the same assemblyprotected internal:
same as internal + methods of derived classes from other assembliespublic:
can be accessed by everyone