@WhiteNinja

Можно ли реализовать следущий подход с помощью Generic типов?

Доброго времени суток!

Есть класс и интерфейс
class Foo : IFoo
{
	// ...
	
	public void Commit() 
	{
		// ...
	}
}

interface IFoo
{
	// Не содержит метод Commit()
	// Но содержит все остальные методы и свойства, которые реализованы в классе Foo
}


Есть другой класс (выполняющий функцию сервиса)
class Bar
{
	protected readonly IFoo _foo;
	private Foo _fooSecure
	{ 
		get { return _foo; }
	}
	
	public Bar() {
		_foo = new Foo();
	}
	
	public void Commit()
	{
		_fooSecure.Commit();
	}
}


Наследуемся от Bar
class BarChild : Bar
{
	public void SomeMethod()
	{
		_foo.Commit(); // Выдаст ошибку, так как у IFoo нет метода Commit. 
					// Это хорошо, этого мы и добивались		
	}
}


Таким образом получается во всех потомках класса Bar нельзя вызвать метод _foo.Commit(), но при этом в самом Bar сделать это можно через свойтсво _fooSecure.

Вопрос:

Можно ли реализовать похужую схему через Generic параметры, чтобы в дочерних классах Bar, нельзя было добраться до метода .Commit()? Так как у каждого потомка BarChild свой тип переменной _foo, и его нужно бы передоавть как generic.
Например:
BarChild : Bar<IAppFoo, AppFoo>
... где IAppFoo нужно, чтобы использовать его в самом BarChild, а AppFoo нужно, чтобы в Bar можно было во-первых создать сам объект через new AppFoo(), а во-вторых потом использовать метод .Commit().

Пробовал по разному, ничего толкового не выходит.
Прошу помощи и подсказки, как можно было бы спроектировать такую, казалось бы не очень сложную, схему.
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C#
interface IFoo
{
  // Не содержит метод Commit()
  // Но содержит все остальные методы и свойства, которые реализованы в классе Foo
}
interface ITransaction
{
    void Commit();
}
class Foo : IFoo, ITransaction
{
  // ...
  
  public void Commit() 
  {
    // ...
  }
}

class Bar<T, TImpl> where TImpl : T, ITransaction, new()
{
  private readonly TImpl _foo;

  protected T Foo {
    get { return _foo; }
  }

  public Bar() {
    _foo = new TImpl();
  }
 
  public void Commit()
  {
    _foo.Commit();
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы