Можно скрыть почти весь код, реализованный интерфейсами к внешним блокам.
interface IVehicle
{
void Drive();
void Steer();
void UseHook();
}
abstract class Vehicle // :IVehicle // Try it and see!
{
/// <summary>
/// Consuming classes are not required to implement this method.
/// </summary>
protected virtual void Hook()
{
return;
}
}
class Car : Vehicle, IVehicle
{
protected override void Hook() // you must use keyword "override"
{
Console.WriteLine(" Car.Hook(): Uses abstracted method.");
}
#region IVehicle Members
public void Drive()
{
Console.WriteLine(" Car.Drive(): Uses a tires and a motor.");
}
public void Steer()
{
Console.WriteLine(" Car.Steer(): Uses a steering wheel.");
}
/// <summary>
/// This code is duplicated in implementing classes. Hmm.
/// </summary>
void IVehicle.UseHook()
{
this.Hook();
}
#endregion
}
class Airplane : Vehicle, IVehicle
{
protected override void Hook() // you must use keyword "override"
{
Console.WriteLine(" Airplane.Hook(): Uses abstracted method.");
}
#region IVehicle Members
public void Drive()
{
Console.WriteLine(" Airplane.Drive(): Uses wings and a motor.");
}
public void Steer()
{
Console.WriteLine(" Airplane.Steer(): Uses a control stick.");
}
/// <summary>
/// This code is duplicated in implementing classes. Hmm.
/// </summary>
void IVehicle.UseHook()
{
this.Hook();
}
#endregion
}
Это протестирует код.
class Program
{
static void Main(string[] args)
{
Car car = new Car();
IVehicle contract = (IVehicle)car;
UseContract(contract); // This line is identical...
Airplane airplane = new Airplane();
contract = (IVehicle)airplane;
UseContract(contract); // ...to the line above!
}
private static void UseContract(IVehicle contract)
{
// Try typing these 3 lines yourself, watch IDE behavior.
contract.Drive();
contract.Steer();
contract.UseHook();
Console.WriteLine("Press any key to continue...");
Console.ReadLine();
}
}
Примечание: ваш билет в службу поддержки GitHub подсказал ответ:
Вам нужно дать heroku свой ключ. Для этого должна быть команда. Если вы не можете найти его, обратитесь в их службу поддержки.
Для этого см. Грэм Коллинз ответ (а также ошибка Heroku: «В доступе отказано (открытый ключ)» ):
heroku keys:add ~/.ssh/id_rsa.pub
Подробнее об этом процессе см. Heroku devcenter .
Затем вы можете увидеть список всех ключей, включая имя ключа, например:
heroku keys
Примечание: предположим, что вы не использовали sudo для генерации ключей, например: « git clone heroku ssh permission denied "иллюстрирует (где heroku keys: add
не работает)
Дополнительная информация о ваших ssh-ключах в вашем другом тикете поддержки GitHub .
debug1: Trying private key: /.ssh/identity
debug1: Trying private key: /.ssh/id_rsa
debug1: Trying private key: /.ssh/id_dsa
Я не уверен, почему тогда он будет смотреть на
/ .ssh
, а не на~ / .ssh
.
Попробуйте переместить вашу пару ключей на этот путь.
Разве это не должно быть:
git push origin master
? По умолчанию ссылка на клонированное репо называется «origin», а не «heroku»
Что отображает
git remote -v show
?
При желании вы можете ссылаться на удаленное репо по имени heroku
git remote add heroku git@github.com:git_username/projectname.git