Pergunta

Eu tenho uma classe de exemplo:

class SampleClass
{
   public virtual string SomeProperty{get; set;}
   public virtual void SomeMethod() {
      // code
   }
}

I pode herdar a partir dele e substituir SomeProperty e SomeMethod assim:

class ChildClass:SampleClass
{
   public override string SomeProperty{get; set;}
   public override void SomeMethod() {
      // code
   }
}

Existe alguma maneira eu posso substituir a partir de um objeto , e não de uma classe? Como

SampleClass sampleObject = new sampleObject();

E tem sampleObject.SomeMethod () ser único? Obrigado.

Foi útil?

Solução

Não, você não pode substituir em uma base per-objeto. No entanto, se você quiser dar a diferentes objetos diferentes modelos de comportamento, você pode sempre passar em um delegado para o construtor:

public class ChildClass : SampleClass
{
   private readonly Action someMethodBehavior;

   public ChildClass(Action someMethodBehavior) {
       this.someMethodBehavior = someMethodBehavior;
   }

   public override void SomeMethod() {
      someMethodBehavior();
   }
}

Isso permite que cada objeto para especificar eficazmente o seu próprio comportamento. Você pode até mesmo permitir que uma referência nula delegado para significar "apenas executar a ação padrão" se você queria que fosse uma espécie de opt-in substituição.

Outras dicas

Não inteiramente certo o que você está tentando realizar, mas você teria apenas que fazer

SampleClass sampleObject = new ChildClass();

Em seguida, você poderia passar sampleObject para qualquer função que tomou um SampleClass, mesmo que ele realmente é um ChildClass, e uma vez que as funções são virtuais, suas funções substituídos seria chamado.

Não - não há nenhuma maneira que você pode substituir a partir de um objeto! Na verdade eu acho que você não entendeu o que e objeto é- um objeto é uma instância de uma classe. Um objeto seu auto doesnt definiu métodos e propriedades, eles vêm da classe à qual o objeto 'pertence'.

Parece-me que, se você precisa experimentar e fazer esse tipo de coisa, então você está indo para o caminho errado ...

A sua pergunta é um pouco obscura, mas eu acho que você não pode exatamente fazer o que quiser - classes anônimas não existem em C # como em Java. Você precisa criar uma subclasse e método de substituição para essa instância. Você poderia fazer a subclasse privado dentro da classe que você está declarando o código, dessa forma ele só poderia ser acessado como um SampleClass, e não um ChildClass

Parece que você está indo possivelmente com alguma coisa de forma errada e eu não sei por que você não iria criar uma classe criança com um método SomeMethod() substituído, mas ...

A única forma seria a de criar explicitamente a classe com isso em mente, mantendo uma propriedade delegado. Então SomeMethod() chamaria o delegado (presumivelmente definido quando o objeto é criado).

O delegado ainda não seria permitido o acesso a membros privada ou protegida, no entanto - sem algum argumento inteligente de passar pelo menos -. Então eu realmente não vejo muita utilidade

No. Isso não é possível em C #. Você teria que criar uma nova classe com o seu comportamento desejado.

Class é um modelo para as suas instâncias ... Por que você quer para criar um objeto sem a sua cópia azul ...

Todos os tempos de execução restringi-lo a criar o objeto sem um plano, contudo, você pode usar o objeto de obter acesso à sua impressão azul e isso é chamado de Reflexão ... Um objeto reflete sua cópia azul.

Eu acho que o que melhor descreve o que você finge são classes anônimas em Java. C #, embora, não permitem que você substituir um método com um tipo anônimo, nem permite substituir qualquer coisa, na verdade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top