Pergunta

Em um programa C #, eu tenho uma classe base abstrata com um estático "Criar" método. O método Create é usado para criar uma instância da classe e armazená-lo localmente para uso posterior. Como a classe base é abstrato, objetos de implementação será sempre dela derivam.

Eu quero ser capaz de obter um objeto da classe base, chamar o método Create estático (implementado uma vez na classe base) através da classe derivada, e criar uma instância do objeto derivado.

Existem quaisquer instalações dentro da linguagem C # que vai permitir-me para puxar esta off. Minha posição de recuo atual é passar uma instância da classe derivada como um dos argumentos para a função Criar, ou seja .:

objDerived.Create(new objDerived(), "Arg1", "Arg2");
Foi útil?

Solução

Tente usar os genéricos:

public static BaseClass Create<T>() where T : BaseClass, new()
{
    T newVar = new T();
    // Do something with newVar
    return T;
}

uso Amostra:

DerivedClass d = BaseClass.Create<DerivedClass>();

Outras dicas

Resumo

Existem duas opções principais. O melhor e mais recente é a utilização de genéricos, o outro é usar a reflexão. Eu estou fornecendo tanto no caso de você precisa para desenvolver uma solução que funciona antes do .NET 2.0.

Generics

abstract class BaseClass
{
  public static BaseClass Create<T>() where T : BaseClass, new()
  {
    return new T();
  }
}

Quando o uso seria:

DerivedClass derivedInstance = BaseClass.Create<DerivedClass>();

Reflexão

abstract class BaseClass
{
  public static BaseClass Create(Type derivedType)
  {
    // Cast will throw at runtime if the created class
    // doesn't derive from BaseClass.
    return (BaseClass)Activator.CreateInstance(derivedType);
  }
}

Quando o uso seria (dividido em duas linhas para facilitar a leitura):

DerivedClass derivedClass
    = (DerivedClass)BaseClass.Create(typeof(DerivedClass));

Você quer criar uma nova instância do derivado de dentro de outra instância derivada, usando um método de fábrica estático na classe base abstrata? se assim for, gostaria de saber porque ... mas ...

 public abstract class MyBase
 {
    public static T GetNewDerived<T>() where T : MyBase, new()
    {
        return new T();
    }    
 }
 public class DerivedA : MyBase
 {
    public static DerivedA GetNewDerived()
    {
        return GetNewDerived<DerivedA>();
    }
 }

 public class DerivedB : MyBase
 {
    public static DerivedB GetNewDerived()
    {
        return GetNewDerived<DerivedB>();
    }
 }     

É isso que você quer?

Parece que você precisa para fazer a Create () método abstrato. E uma vez que você faz que você poderia muito bem mudar o nome e torná-lo o construtor também. Então você pode ter um método diferente Init () que você chamar depois que o objeto é construído, se você precisa, e efeitos normais polimorfismo vai lidar com as coisas.

Você não pode fazê-lo sem informações para fora; ou o tipo da classe de derivados, uma instância do mesmo, ou o nome completo da classe derivada. Qualquer um destes são equivalentes ao que você já está fazendo; não há uma solução melhor que eu estou ciente de. A própria natureza dos métodos estáticos se opõe a qualquer coisa mais elegante.

Eu não tenho certeza do que são as suas metas de design, mas a partir do que você pediu que soa como ele pode acabar com um monte de cheiro de código. Eu acho que você deve realmente olhar para a inversão de controle (COI) / Dependency Injection (DI) padrões de design que são implementadas em vários quadros como o Microsoft Unidade, Castelo de Windsor, StructureMap, Ninject, Spring.Net e assim por diante.

Eu acho que se você olhar para usar um contêiner IoC ele vai resolver o seu problema de forma muito mais limpa e maneira de baixo acoplamento.

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