2013-09-19 5 views
-1

В C# Как создать экземпляр отдельного класса при использовании абстрактного класса? Я пытаюсь создать экземпляр foo3.Создание класса с конструктором

Значение:

abstract class foo 
{ 
    public string myId {get;set;} 
    public string mystring {get;set;} 
    public foo3 my3rdFoo {get;set} 
} 

class foo2 : foo 
{ 
    public string myFavoriteFoo {get;set;} 
} 

class foo3 
{ 
    public string myName{get;set}   
} 

После создания нового foo2 успешно .... (я не добавлял код.)

Im пытается вызвать foo3 используя код ниже:

((foo2)newDoc).foo3.myName = "blah...blah..."; 

Но я получаю пустой ошибка .... здесь ...

+5

foo3 - null возможно? –

+0

Правильно, но как его создать? Я редактировал свой вопрос. Спасибо ... – InCode

+0

Что именно вы пытаетесь сделать в этой последней строке? Вы объявляете свой класс foo2 и получаете доступ к foo3 как свойство из вашего класса foo2? – Farax

ответ

3

Вы должны сначала создать экземпляр класса ТНА t выводит ваш абстрактный класс, в вашем случае - foo2. Затем назначить новый объект, который вы хотите создать экземпляр:

var myFoo2 = new foo2(); 
myFoo2.my3rdFoo = new foo3(); 

ИЛИ используя объект инстанцирования синтаксис:

var myFoo2 = new foo2{ 
    my3rdFoo = new foo3() 
}; 

ИЛИ добавить my3rdFoo экземпляра в Foo2 конструктор:

public foo2(){ 
    my3rdFoo = new foo3(); 
} 

Вы не можете напрямую создавать абстрактный класс.

Только после этого вы можете присвоить значения свойствам подкласса. Кроме того, вы должны назвать классы в верхнем регистре - будет легче дифференцировать позже.

+0

Хорошо. Позвольте мне попробовать это последнее предложение ... – InCode

+0

Зачем ставить экземпляр my3rdFoo в конструкторе 'foo2' вместо' foo''s? –

+0

Хотелось бы знать, почему. – InCode

0
abstract class foo 
{ 
    public string myId {get;set;} 
    public string mystring {get;set;} 
    public foo3 my3rdFoo {get;set} 
} 

class foo2 : foo 
{ 
    public string myFavoriteFoo {get;set;} 
} 

class foo3:foo2 
{ 
    public string myName{get;set}   
} 

Instantiate использованием

Foo3 myThirdFoo = new foo3(); 
string result = foo3.myName; 

Если вы хотите получить доступ к третьему Foo внутри foo2 затем использовать этот код

abstract class foo 
{ 
    public string myId {get;set;} 
    public string mystring {get;set;} 
    public foo3 my3rdFoo {get;set} 
} 

class foo2 : foo 
{ 
    public foo3 myFavoriteFoo {get;set;} 
} 

class foo3 
{ 
    public string myName{get;set}   
} 

и использовать следующим образом

foo3 ThirdFoo = new foo3(); 
ThirdFoo.myName = "Something nice"; 

foo2 SecondFoo = new foo2(){myFavouriteFoo = ThirdFoo}; 
String Result = SecondFoo.myFavouriteFoo.myName; 

еще другим способом будет

abstract class foo 
    { 
     public string myId {get;set;} 
     public string mystring {get;set;} 
     public foo3 my3rdFoo {get;set} 
    } 

    class foo2 : foo 
    { 
     public foo3 myFavoriteFoo {get;set;} 

     public foo2(string myName) 
     { 
      foo3 = new foo3(); 
      foo3.myName = myName; 

     } 

    } 

    class foo3 
    { 
     public string myName{get;set}   
    } 

А затем к нему доступ с помощью

foo2 SecondFoo = new foo2("Something nice"); 
String Result = SecondFoo.myfavouritefoo.myName; 
0

Я хотел бы создать экземпляр любые объекты в конструкторе. Поэтому, учитывая ваш код, я бы инициализировал его «foo3» в стандартном конструкторе базового класса.

abstract class foo 
{ 
    public foo() { this.my3rdFoo = new foo3(); } 
    public string myId {get;set;} 
    public string mystring {get;set;} 
    public foo3 my3rdFoo {get;set} 
} 

class foo2 : foo 
{ 
    public string myFavoriteFoo {get;set;} 
} 

class foo3 
{ 
    public string myName{get;set}   
} 
+2

Если 'foo3' не является' IDisposable' или неуправляемым ресурсом (ни один из них не имеет здесь случая), нет смысла делать базовый класс одноразовым. –

+0

Им любопытно, в чем разница между созданием экземпляра в абстрактном и экземпляром в foo2? – InCode

+0

@ ENC0D3D Различия в том, как используется класс foo2. Но если другой класс унаследован от базы foo, тогда ему также потребуется создать экземпляр элемента базового класса. ИМО, лучше убедиться, что каждый класс знает, как управлять своими собственными ресурсами, и не зависеть от дочерних классов, чтобы стать надлежащим образом созданным. Детские классы всегда могут переопределять реализацию базового класса. – brentlightsey

0

Ваш конкретизации должен выглядеть как этот

foo2 newDoc = new foo2(); 

newDoc.myId = "123"; 
newDoc.mystring = "Hey"; 

newDoc.my3rdFoo = new foo3(); //move this to a constructor foo() if you would like 
newDoc.my3rdFoo.myName = "blah...blah..."; 

Вы не можете сделать ((foo2)newDoc).foo3.myName. Вместо этого она должна быть newDoc.my3rdFoo.myName

потому foo3 класс, тогда как my3rdFoo является экземпляром класса foo3, свойство которого можно установить.

0

Вы можете создать экземпляр foo3 объекта в конструкторе foo:

abstract class foo 
{ 
    public string myId {get;set;} 
    public string mystring {get;set;} 
    public foo3 my3rdFoo {get;set} 
    public foo() 
    { 
      this.my3rdFoo = new foo3(); 
    } 
} 

использовать его как это:

foo newDoc = new foo2(); 
newDoc.my3rdFoo.myName = "blah...blah..."; 

И вы должны рассмотреть капитализировать свои классы и свойства так, что вы подходите C# conventions ,

Смежные вопросы