개인 멤버는 C #에서 상속됩니까?
방금 다음과 같은 튜토리얼을 보았습니다.
Class Dog
{
private string Name;
}
Class SuperDog:Dog
{
private string Mood;
}
그런 다음 SuperDog가 Name도 상속한다는 것을 표시하는 UML이 있습니다. 나는 시도했지만 나에게는 공개 회원 만 상속되는 것 같습니다. 적어도 나는 그것이 public으로 선언되지 않는 한 Name에 접근 할 수 없었다.
파생 클래스는 기본 클래스의 public, protected, internal 및 protected 내부 멤버에 액세스 할 수 있습니다. 파생 클래스가 기본 클래스의 전용 멤버를 상속하더라도 해당 멤버에 액세스 할 수 없습니다. 그러나 이러한 모든 private 멤버는 파생 클래스에 여전히 존재하며 기본 클래스 자체에서 수행하는 것과 동일한 작업을 수행 할 수 있습니다. 예를 들어 보호 된 기본 클래스 메서드가 개인 필드에 액세스한다고 가정합니다. 상속 된 기본 클래스 메서드가 제대로 작동하려면 해당 필드가 파생 클래스에 있어야합니다.
출처 : http://msdn.microsoft.com/en-us/library/ms173149.aspx
기술적으로는 그렇습니다.하지만 실제로는 아닙니다.
기본 클래스의 모든 것은 파생 클래스로 상속됩니다. private로 표시된 멤버는 무결성을 위해 파생 클래스에 액세스 할 수 없습니다. 파생 클래스에서 액세스 할 수 있도록해야하는 경우 멤버를 보호 됨으로 표시해야합니다.
상속과 관련하여 다양한 수준의 구성원 액세스 가능성이 있습니다.
public
: 기본 클래스의 모든 공용 멤버는 파생 클래스 내에서 파생 클래스의 인스턴스에 액세스 할 수 있습니다.
protected
: 기본 클래스의 모든 보호 된 멤버는 파생 클래스의 인스턴스가 아닌 파생 클래스 내에서 액세스 할 수 있습니다.
protected internal
: 기본 클래스의 모든 보호 된 내부 멤버는 파생 클래스 내에서 및 동일한 어셈블리 내에서 생성 된 파생 클래스의 인스턴스에 액세스 할 수 있습니다.
internal
: 기본 클래스의 모든 내부 멤버는 파생 클래스 내에서 그리고 동일한 어셈블리 내의 파생 클래스 인스턴스에 액세스 할 수 있습니다.
private
: 파생 클래스 내에서 파생 클래스의 인스턴스에 액세스 할 수있는 기본 클래스의 개인 멤버가 없습니다.
SuperDog는 이름 필드를 상속합니다.
SuperDog는 것입니다 NOT 그래서 실용화가 없다, 비록 필드에 액세스 할 수 있습니다 (지금까지 SuperDog에 관한 한).
Private 멤버 는 파생 클래스 내에서 볼 수 있습니다. (하위 클래스가 기본 클래스 내에 중첩 된 경우)
public class Person
{
private string message;
public override string ToString()
{
return message;
}
public static Person CreateEmployee()
{
return new Employee();
}
class Employee : Person
{
public Employee()
{
this.message = "I inherit private members!";
}
}
}
Credit for the example goes to KodefuGuru in this thread at MSDN.
No, they aren't.
The protected
modifier can make fields available to derived classes, but this is generally considered a bad idea from a maintenance perspective. You'd want to use protected properties instead.
Yes, although heirs cannot access that member.
If you with that they will be able to access it, declare it as protected.
The member in the base class has to be at least protected so it can be visible in the derived class.
try the keyword protected, instead of public/private:
http://msdn.microsoft.com/en-us/library/bcd5672a(VS.71).aspx
Make Name protected
or public
instead, that will be accessible. Private members are not accessible from derived classes
Private members are not accessible to descendants of a class.
I'm not sure of all the access modifiers, but at the most basic only public and protected members are accessible.
Yes, The are inherited. But you cannot access them as they are private :).
As others have said private members are inherited. Member access is a different subject but not totally disjoint from an inheritance perspective. It is important to understand that all members are inherited regardless of their access modifier because it effects the sizes of the subclasses. Consider the following code.
public class Foo
{
private int a;
public int b;
}
public class Bar : Foo
{
private int c;
public int d;
}
Foo
will consume 16 bytes on the heap. 4 for the syncblock, 4 for the type information (method table), and 4 each for the int
variables for a total of 12. Bar
, on the other hand, will consume 24 bytes. 4 for the syncblock, 4 for the type information (method table), 4 each for the int
fields inherited from Foo
, and 4 each for the int
fields in Bar
for a total of 24.
People have said it, but here's an example of why you need the private fields in the derived class:
class Program
{
static void Main(string[] args)
{
var r = new Random();
foreach(var i in Enumerable.Range(0,100))
new Derived(r).Printer();
Console.Read();
}
}
public class Base
{
private Random r;
public Base(Random r) { this.r = r; }
protected void Print()
{
Console.WriteLine(r.Next(1, 10000));
}
}
public class Derived : Base
{
public Derived(Random r) : base(r) { }
public void Printer()
{
base.Print();
}
}
Yes, but they are not accessible, so looking at it you can honestly say that they are not inherited. But yes they really are
참고URL : https://stackoverflow.com/questions/2950820/are-private-members-inherited-in-c
'Programing' 카테고리의 다른 글
헤더 ( 'Content-Type : text / plain'); (0) | 2020.12.14 |
---|---|
기존 heroku 앱을 개발을 위해 새 위치로 가져 오려면 어떻게해야합니까? (0) | 2020.12.14 |
폴더, 하위 폴더 및 모든. (0) | 2020.12.14 |
내 ASP.NET 웹 사이트를 wwwroot 폴더에 넣어야합니까? (0) | 2020.12.13 |
C / C ++의 작은 따옴표, 큰 따옴표 및 sizeof ( 'a') (0) | 2020.12.13 |