2010-06-22 18 views
9

Mientras estudio C# en ASP.net tengo problemas para entender varias clases. ¿En qué situación debo usar las siguientes clases private,public,protected,abstract,static,sealed?Uso de "Clase" en C#

Sería mejor si alguien puede explicar esto con ejemplos fáciles.

+14

necesita leer el Principio C# 2005/2008. No podemos explicarle toda la enciclopedia de C#. –

+2

Creo que ahora debería considerar algunas pautas sobre hacer preguntas, no podemos enseñarle a nadie "cómo programar" aquí o explicar lo que ya existe en MSDN o tutoriales de ayuda. –

+0

Le sugiero que lea un poco sobre el polimorfismo @ http://msdn.microsoft.com/en-us/library/ms173152%28v=VS.80%29.aspx por ejemplo – KroaX

Respuesta

19

Esas no son clases.

private, protected y public son modificadores de acceso. Indican el que otro código puede ver el código al que afectan:

public class Foo 
{ 
    private int _myOwn = 1; 
    protected int _mineAndChildren = 2; 
    public int _everyOnes = 3; 
} 

public class Bar : Foo 
{ 
    public void Method() 
    { 
     _myOwn = 2; // Illegal - can't access private member 
     _mineAndChildren = 3; // Works 
     _everyOnes = 4; // Works 
    } 
} 

public class Unrelated 
{ 
    public void Method() 
    { 
     Foo instance = new Foo(); 
     instance._myOwn = 2; // Illegal - can't access private member 
     instance._mineAndChildren = 3; // Illegal 
     instance._everyOnes = 4; // Works 
    } 
} 

Una clase abstract es uno que pueda contener abstract miembros. Un miembro abstract no tiene implementación, por lo que todas las clases derivadas deben implementar los miembros abstract.

No se puede heredar una clase sealed. Una clase static es sealed, pero también solo puede contener static miembros.

Le sugiero que comience con "Getting Started with Visual C#. Esta es una pregunta muy básica.

+0

¿Cómo funciona _everyOnes en la clase No relacionada? Necesitaría una instancia de Foo o Bar para acceder al campo _everyOnes. – lxalln

+0

@CnTwo: buena captura. Copiar y pegar el error. –

+0

Muchas gracias por los ejemplos con explicación. – Hoque

0

private y public se refieren a la visibilidad de la clase exterior del conjunto (por ejemplo DLL o EXE) que vive. protected es un modificador para los métodos, significa que sólo las clases que heredan de la declarador puede llamar al método.

abstract identifica una clase que no se pueden crear directamente, y está diseñado sólo para proporcionar una base para otras clases.

Aplicado a métodos, static significa que se puede acceder como parte del tipo, en lugar de una instancia de la clase:

class Bar { 
    static void Foo() { ... } 
    void Foo() { ... } 
} 

El primero puede ser llamado como esto:

Bar.Foo(); 

el segundo sólo como esto:

Bar b = new Bar(); 
b.Foo(); 

Aplicado a clases, static limita a la clase que contiene métodos estáticos única. Es más estético que cualquier otra cosa, pero también ayuda al compilador.

El modificador sealed le dice al compilador que no se puede heredar una clase.

1

Lo que tienes allí son modificadores, no tipos de clases.

private, public y protected son Modificadores de acceso. Definen qué tan accesible quiere que sea el código.

Antes de analizar los demás modificadores que ha enumerado, le sugiero que intente comprender la Programación Orientada a Objetos. Here es un enlace lleno de buenos recursos que puede revisar.

8

public, private y protected no son clases , son modificadores de acceso. Cambian lo que está permitido para acceder a las clases que decora con ellos. Se aplican tanto a las clases como a los miembros de las clases.

  • public artículos se pueden ver desde cualquier lugar
  • private clases sólo se pueden ver desde dentro del mismo archivo
  • private miembros de las clases sólo se pueden ver dentro de esa clase
  • protected miembros son visibles desde el interior la clase y sus descendientes
  • internal las clases son públicas dentro del mismo ensamblaje.

La palabra clave abstract marca una clase o método como tener ninguna implementación , y debe también ser sustituidos (con la palabra clave override) en un tipo derivado antes de poder utilizarlo.

No se puede heredar una clase sealed.

El uso de la palabra clave static en un miembro de la clase indica que el miembro pertenece a la propia clase, en lugar de una instancia específica de la misma. Marcar una clase como static impone la restricción de que todos los miembros de esta clase también deben ser static.

+3

+1 para una respuesta excelente, nítida y al grano. Tenga cuidado con la palabra clave estática ... si declara una variable como estática en una aplicación web ASP.NET, entonces la misma variable se utilizará para cada usuario de la aplicación. ... por lo tanto, sería muy imprudente almacenar el nombre de usuario/contraseña (datos confidenciales) en una variable estática ya que otros usuarios también podrán ver los datos. – Dal

+0

@Dal: tenga en cuenta el motivo: el miembro estático pertenece a la clase. Todas las solicitudes, independientemente del usuario, usarían la misma clase, de ahí el mismo miembro estático. –

+0

@John - Sí, entiendo completamente, aprendí de una dura lección donde una vez almacené un productID como una var estática en una aplicación web ... no tardé en que ocurrieran todo tipo de problemas (por ejemplo, productos que intercambiaban información, etc.) ... lección aprendida :) – Dal

5

private, public y protected indican quién puede acceder a los miembros de una clase. privado significa que nadie fuera de la clase puede verlo. público significa que todos pueden verlo. protected es como private, pero las subclases pueden acceder a él.

class Data 
{ 
    private int counter; // only accessible to class functions 
    protected int id; // accessible to class and subclass functions 
    public string name; // accessible from all code 
} 

abstract significa que esta no es una clase acabado - que está destinado a ser utilizado como una base para subclases. A menudo hay funciones virtuales en su definición, funciones destinadas a ser "completadas" por una subclase.

abstract class Window 
{ 
    // cannot create objects of this class directly 
    // need to create sub class 
} 

static en la definición de clase significa que sólo hay una copia global. Más o menos revierte la clase a un módulo antiguo. static contra un miembro indica que es un miembro global dentro de la clase, no hay una versión diferente para cada objeto que hagas de esa clase.

static class Configuration 
{ 
    // only one instance of the object 
} 

class Data 
{ 
    private static int counter; // all Data objects access this one counter 
    private int id;    // each Data object has a different id 
} 

sealed previene la creación de subclases; también se puede aplicar a funciones individuales para evitar que se anulen en una subclase.

sealed class TelephoneNumber 
{ 
    // cannot create subclass of TelephoneNumber 
} 

class Address 
{ 
    public sealed string FormatAddress() 
    { 
     // this function cannot be overridden on a subclass 
    } 
} 
3

No puedo comentar su pregunta, pero tengo una pequeña adición, pero importan información para usted.

los modificadores de acceso son solo una característica del compilador. cada .NET-programm puede ignorar esto al usar la reflexión y puede acceder a sus clases y metodos flaged privados.

Un exampel:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 

namespace ReflectPrivateMembers 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ConstructorInfo ci = typeof(Hello).GetConstructor(BindingFlags.NonPublic| BindingFlags.Instance ,null,System.Type.EmptyTypes,null); 
      object helloObject = ci.Invoke(System.Type.EmptyTypes); 
      MethodInfo[] helloObjectMethods = helloObject.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly| BindingFlags.Instance); 

      foreach (MethodInfo mi in helloObjectMethods) 
      { 
       mi.Invoke(helloObject, System.Type.EmptyTypes); 
      } 
      Console.ReadLine(); 
     } 
    } 
    public class Hello 
    { 
     private Hello() 
     { 
      Console.WriteLine("Private Constructor"); 
     } 
     public void HelloPub() 
     { 
      Console.WriteLine("Public Hello"); 
     } 
     private void HelloPriv() 
     { 
      Console.WriteLine("Private Hello"); 
     } 
    } 
} 

Fuente: Reflection with Private Members

+3

Las modificaciones de acceso no son un mecanismo de seguridad, están ahí para hacer cumplir los patrones de programación. Punto tomado, pero aún ... – tylerl

2

Los tres primeros son modificadores de acceso, que se puede aplicar a tipos y miembros. private significa que solo se puede acceder a algo desde dentro de su tipo de declaración. protected significa que se puede acceder a algo mediante herederos del tipo que declara, o por algo en el tipo mismo. public significa que se puede acceder a algo desde cualquier lugar que tenga una referencia válida al tipo de declaración.

El resto también se puede aplicar a ambos tipos y miembros. abstracto(en un miembro de) significa el miembro no tiene ninguna aplicación (la aplicación debe ser proporcionado por herederos del tipo) o (en un tipo) que el tipo no puede ser instanciada (sólo heredado). estática(en un miembro de) significa que el miembro se comparte estáticamente por todas las personas que llaman, o (en un tipo) que el tipo sólo puede contener miembros estáticos y por lo tanto no puede ser instanciada (es decir, que no tiene cualquier miembro de instancia y, por lo tanto, no puede servir ninguna instancia de sí mismo). sellados(en un miembro virtual o abstracto heredado) significa que herederos del tipo no pueden anular el miembro, o (en un tipo) que el tipo no puede ser heredada de.

Hay un par de otros modificadores de usted debe ser consciente de: interna es otro modificador de acceso que significa que algo se puede acceder a cualquier cosa dentro del mismo conjunto (o proyecto) como el tipo de declarar.

También, virtual(en un miembro de) significa que el miembro opcionalmente puede ser anulado por un heredero del tipo, pero suministra su propia implementación predeterminada. parcial(en un miembro) permite proporcionar la firma de un miembro en un solo archivo, y la puesta en práctica en otro, o (en un tipo) le permite dividir la definición de un tipo a través de múltiples códigos archivos.