C #: um pode _object_ substituir um método de classe?
-
12-09-2019 - |
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.
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.