---
title: "Abstrakt klass?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/157950-abstrakt-klass"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "Josef"
published: "2007-03-07T18:39:23.000Z"
updated: "2007-03-07T22:03:29.000Z"
replies: 6
views: 623
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/157950-abstrakt-klass"
---

# Abstrakt klass?

## #1 — Josef, 2007-03-07T18:39Z

Jag har två klasser. En BaseManager\<T\> och en UserManager som ärver av BaseManager.

```
public abstract class BaseManager<T>
    {
        public bool Create(List<SqlParameter> sqlParams, string sp)
        {
            int _rowsAffected;

            using (SqlConnection cn = DataAccess.GetConnection())
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.Connection = cn;
                    cmd.CommandText = sp;
                    cmd.CommandType = CommandType.StoredProcedure;

                    foreach (SqlParameter param in sqlParams)
                        cmd.Parameters.Add(param);

                    try
                    {
                        cn.Open();
                        _rowsAffected = cmd.ExecuteNonQuery();
                    }
                    catch (SqlException)
                    {
                        throw;
                    }
                }
            }

            return (_rowsAffected == 1);
        }
}
```

```
    class UserManager : BaseManager<User>
    {
        public override bool Create(User item)
        {
            bool _done = false;

            SqlParameter p0 = new SqlParameter("@username", SqlDbType.NChar);
            p0.Value = item.Username;

            SqlParameter p1 = new SqlParameter("@password", SqlDbType.Binary);
            p1.Value = item.Password;

            SqlParameter p2 = new SqlParameter("@email", SqlDbType.NChar);
            p2.Value = item.Email;

            SqlParameter p3 = new SqlParameter("@year_of_birth", SqlDbType.Int);
            p3.Value = item.YearOfBirth;

            SqlParameter p4 = new SqlParameter("@gender", SqlDbType.NChar);
            p4.Value = item.Gender;

            SqlParameter p5 = new SqlParameter("@country", SqlDbType.Int);
            p5.Value = item.Country;

            _done = base.Create(new List<SqlParameter>().Add(p0, p1, p2, p3, p4, p5), "sp_CreateUser");

            return _done;

        }
```

Men får bara felet: *'BL.UserManager.Create(BL.User)': cannot override inherited member 'BL.BaseManager\<BL.User\>.Create(BL.User)' because it is not marked virtual, abstract, or override*.
Men det är väl precis den är? :q

Vad gör jag för fel?

Permalänk: https://www.webforum.nu/p/157950

## #2 — Pace, 2007-03-07T18:47Z

Metoden (Create) måste också vara märkt.

Permalänk: https://www.webforum.nu/p/1943412

## #3 — emission, 2007-03-07T18:53Z

...som sagt. Den måste vara virtual. Skulle dock vilja föreslå att du gör en abstrakt och tom Create-metod i basklassen (som sedan "overridas") och sedan gör om den nuvarande Create-metoden till en protected-metod med annat namn (PerformCreate el. likn). De metoder du har nu gör nämligen tämligen olika saker (dessutom med helt olika parametrar. En klassisk override är alltså ändå omöjlig), vilket gör att den inte blir en logisk överladdning. Dessutom bör du antagligen inte exponera metoden som tar sql-parametrar publikt.

Permalänk: https://www.webforum.nu/p/1943418

## #4 — Gladh, 2007-03-07T19:08Z

Det finns en liten skillnad mellan en virtuell och abstrakt metod i din basklas.. 

Det är att om du gör din metod abstrakt så **måste** dina klasser som ärver från denna klass implementera sin egen metod som alltid kommer att användas (även från din basklass), du kan dessutom inte skriva någon kodlogik i din metod i basklassen, vilket är naturligt eftersom den aldrig kommer exekveras.

Om du istället väljer att skriva din basklass metod som virtuell så betyder det att du ger dina klasser som ärver från basklassen **en möjlighet** att själv implementera sin egen kod. Men om de klasser inte gör det så kommer basklassens metod och kod att exekveras.

En liten men ack så viktigt skillnad...

\- M

Permalänk: https://www.webforum.nu/p/1943424

## #5 — Josef, 2007-03-07T20:14Z

emission: Nej, all kod du ser blir ett underliggande datalager som inte kommer att exponeras.

Gladh: Skillnaderna kände jag till. :)

Tack för hjälpen! Fungerar som det ska dock med lite mer kod. ;)

Permalänk: https://www.webforum.nu/p/1943450

## #6 — emission, 2007-03-07T21:17Z

Bra!

Antar att du gjorde något i stil med det jag försökte förklara, men jag passar ändå på att visa med kod.

```
public abstract class BaseManager<T>
{
	public abstract bool Create(T item);

	protected bool PerformCreate(List<SqlParameter> sqlParams, string sp)
	{
	    //Databaskod
	}
}

public class UserManager : BaseManager<User>
{
	public override bool Create(User item)
	{
	    //Preparera parametrar

	    _done = base.PerformCreate(new List<SqlParameter>().Add(p0, p1, p2, p3, p4, p5), "sp_CreateUser");

	    return _done;

	}
}
```

PS. Det är inte så bra att kalla SP:ar för sp_xxx i SQL Server, eftersom det är lite halvreserverat och gör att namnuppslaget tar längre tid. DS

Permalänk: https://www.webforum.nu/p/1943467

## #7 — Josef, 2007-03-07T22:03Z

Jag gjorde precis så. :) Men tack iaf.

Jasså? Uppslaget tar längre tid? Då får jag ändra.

PS. Erkänn du bara ville få 5300 inlägg? ;) Jämnt och bra

Permalänk: https://www.webforum.nu/p/1943482

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/157950-abstrakt-klass
